monobank-mcp
# monobank-mcp
[](https://www.npmjs.com/package/@dirgen/monobank-mcp)
[](LICENSE)
[](https://nodejs.org)
MCP server for [Monobank](https://monobank.ua) — exposes your accounts, transactions, exchange rates, and webhook configuration as tools for Claude and other MCP clients.
Responses are pre-processed for LLM consumption: amounts are in base currency units (not cents), timestamps are ISO 8601, currency codes are ISO 4217 strings, and permissions are decoded to human-readable names. Frequently-accessed data is cached server-side for 1 hour so repeated reads never hit the Monobank rate limit.
## Quick Start — Claude Desktop
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"monobank": {
"command": "npx",
"args": ["-y", "@dirgen/monobank-mcp"],
"env": {
"MONOBANK_API_TOKEN": "your_token_here"
}
}
}
}
```
## Quick Start — Claude Code
```bash
claude mcp add monobank -- npx -y @dirgen/monobank-mcp
```
Then add your token to `.claude/settings.json`:
```json
{
"mcpServers": {
"monobank": {
"env": { "MONOBANK_API_TOKEN": "your_token_here" }
}
}
}
```
## Getting a Token
Open [api.monobank.ua](https://api.monobank.ua/index.html) and scan the QR code with the Monobank app to generate your personal API token. The token never leaves your machine — it is passed directly to the server process as an environment variable.
## Available Tools
### Public — no token required
| Tool | Description |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `monobank-bank-currency` | All Monobank exchange rates. Returns `baseCurrency` / `quoteCurrency` (ISO 4217), `date` (ISO 8601), and `rateSell` / `rateBuy` (traded pairs) or `rateCross` (cross rates). |
| `monobank-bank-currency-rate` | Exchange rate for a single currency pair. Inputs: `baseCurrency`, `quoteCurrency` (defaults to `UAH`). Faster than fetching the full list. |
### Personal — requires `MONOBANK_API_TOKEN`
| Tool | Description |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `monobank-personal-client-info` | Full client profile: identity, decoded token permissions, all accounts and jars including FOP/business accounts (`managedClients`). Account `id` fields are what you pass to the statement tool. |
| `monobank-personal-accounts` | Compact account and jar list (id, type, currencyCode, balance, maskedPan). Use this for quick account discovery before fetching statements. |
| `monobank-personal-statement` | Transaction history for an account. Inputs: `accountId` (from client-info, or `"0"` for default UAH account), `fromDate`, `toDate` (ISO 8601 with timezone). Maximum range: 31 days per request. |
| `monobank-get-webhook` | Returns the webhook URL currently configured for this token. Empty string means no webhook is set. |
| `monobank-set-webhook` | ⚠️ **Destructive.** Sets the webhook URL. Overwrites the existing URL immediately with no confirmation — check the current value with `monobank-get-webhook` first. |
| `monobank-unset-webhook` | ⚠️ **Destructive.** Removes the webhook by setting the URL to empty string. |
## Caching
The server caches responses to stay within Monobank's rate limits and avoid redundant API calls:
| Data | Cache TTL |
| ------------------------------------- | ----------------------------------------------- |
| Client info (`/personal/client-info`) | 1 hour |
| Currency rates (`/bank/currency`) | 1 hour |
| Statement with a fixed `toDate` | 1 hour |
| Statement without `toDate` | Not cached (open-ended range → stale data risk) |
Webhook mutations automatically invalidate the client-info cache so the next read reflects the updated URL.
## Rate Limits
Monobank personal endpoints allow **1 request per 60 seconds**. If the limit is hit, the server returns a clear error message telling you to wait 60 seconds. The 1-hour cache means most repeated reads are served locally without hitting the API at all.
## Developer Setup
Requires Node.js ≥ 24.17.0 and pnpm.
```bash
git clone https://github.com/todesstoss/monobank-mcp
cd monobank-mcp
pnpm install
```
Create a `.env` file:
```env
MONOBANK_API_TOKEN=your_token_here
```
```bash
pnpm start # run the MCP server
pnpm inspect # open MCP Inspector in the browser for interactive testing
pnpm typecheck # type-check without emitting
pnpm lint # lint src/
```
## Troubleshooting
**Invalid token / 401** — regenerate your token at [api.monobank.ua](https://api.monobank.ua/index.html). Tokens expire if unused.
**Rate limit / 429** — wait 60 seconds. The server will tell you when this happens. Repeated reads within an hour are served from cache and won't trigger this.
**Statement range > 31 days** — split the request into multiple calls, each covering ≤ 31 days. The tool will tell you if the range is too wide.
**Currency pair not found** — use `monobank-bank-currency` to see all available pairs. Only UAH pairs and EUR/USD are available.
**No `managedClients` in client-info** — this field only appears if you are registered as a FOP (sole proprietor) with Monobank. All tokens are the same personal token — `managedClients` is simply absent if you have no FOP accounts.
## License
MIT
TDQS
Scored across 8 tools
Most tools have distinct purposes, but there is some overlap between monobank-bank-currency and monobank-bank-currency-rate, and between monobank-personal-client-info and monobank-personal-accounts. The descriptions clearly differentiate these, so an agent can choose correctly.
All tool names use the 'monobank-' prefix and lowercase hyphens, but the pattern is not fully consistent: data retrieval tools use noun phrases (e.g., monobank-personal-statement), while webhook tools use verb-noun phrases (e.g., monobank-set-webhook). This is a minor deviation from a fully uniform convention.
With 8 tools, the server is well-scoped for a personal finance integration, covering currency rates, client information, accounts, statements, and webhook management without unnecessary redundancy.
The tool surface covers the essential read operations (rates, client info, accounts, statements) and the full webhook lifecycle, which matches the server's informational purpose. Minor gaps exist, such as no way to fetch a single account's details directly, but the accounts list provides a workaround.