monobank-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@monobank-mcpWhat are the current USD/UAH and EUR/UAH exchange rates?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
monobank-mcp
MCP server for the Monobank open API: exchange rates, account and jar balances, and statements, exposed as tools for Claude Code, Claude Desktop, or any MCP client.
Tools
Tool | Token | What it returns |
| no | Monobank buy/sell/cross rates, optionally filtered by alpha code ( |
| no | The bank's secp256k1 public key, key id, and server time (for webhook signature checks) |
| yes | Name, accounts (balance, credit limit, own funds, IBAN, masked PAN), jars, managed FOP clients |
| yes | Transactions for an account or jar in a window, with per-currency income/expense totals |
| yes | Replaces (or clears, with |
Amounts are converted from the bank's minor units to major units (-950 UAH, not -95000), currency codes are mapped from ISO 4217 numeric to alpha, and timestamps are ISO 8601. A datetime without an offset is read as UTC. A rate pair USD/UAH with buy 44.46 means the bank buys 1 USD for 44.46 UAH. For a purchase in a foreign currency the bank reports the foreign leg without its currency code, so it is passed through as operationAmountMinorUnitsInTransactionCurrency.
Related MCP server: Monobank MCP Server
Bank-side limits the server enforces
Personal endpoints accept one call per endpoint per 60 seconds. Identical requests inside that window share one cached response. A different request to the same endpoint (including set_webhook) waits for the next free slot for up to 35 seconds, which keeps a tool call under the usual 60-second MCP request timeout; a longer wait fails fast and says how many seconds to retry in. A slot is never handed back after a request may have reached the bank, and a real 429 pushes the next slot out a full minute. Two processes sharing one token cannot see each other's calls, so run one server per token.
Every request has a 20-second timeout covering headers and body. Responses are shared between concurrent identical calls, so cancelling one MCP request does not abort the bank call for the others.
A statement window may span at most 31 days plus 1 hour, measured against now when
tois omitted. Longer windows are rejected before any network call; ask for the range in several calls.Times are unix seconds,
YYYY-MM-DD, orYYYY-MM-DDTHH:MM[:SS][Z|+HH:MM]; nothing else is accepted, and impossible dates are rejected rather than rolled over. A bare date asfrommeans midnight UTC; astoit means the last second of that day. An omittedtois the start of the current minute, sent explicitly and reported back, so consecutive windows can be chained exactly.Public currency rates are cached for 5 minutes, matching the bank's refresh cadence.
Clients under 16 cannot use the API; children's accounts are visible from the parent's token.
Setup
Get a personal token at https://api.monobank.ua/ (sign in with the Monobank app). It grants read access to every account on the profile, so treat it like a password.
Build:
npm install npm run buildRegister with Claude Code:
claude mcp add monobank -e MONOBANK_TOKEN=your_token -- node /absolute/path/to/monobank-mcp/dist/index.jsOr in Claude Desktop's
claude_desktop_config.json:{ "mcpServers": { "monobank": { "command": "node", "args": ["/absolute/path/to/monobank-mcp/dist/index.js"], "env": { "MONOBANK_TOKEN": "your_token" } } } }
Without MONOBANK_TOKEN the public tools still work; the personal ones return an error explaining how to get a token.
Development
npm test # vitest, no network
npm run typecheck
npm run dev # run from source over stdioTests exercise the server through an in-memory MCP client with a fake fetch, so nothing touches the bank.
API notes
The OpenAPI document is embedded in the Redoc page at https://api.monobank.ua/docs/index.html (there is no separate JSON URL); this server was written against version v250818. The corporate API for service providers is a different, signature-authenticated API and is out of scope here.
Available Tools
5 toolsget_bank_public_keyMonobank public keyARead-only
Public Monobank signing key (secp256k1, base64), its key id, and the bank server time. Used to verify webhook signatures.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context about what the response contains (key, key id, server time) and its role in webhook verification. It does not disclose additional behaviors like authentication requirements or rate limits, but the read-only nature is already signaled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, free of fluff, and front-loads the key resource details before explaining the purpose. Every sentence contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of explaining what the tool returns and why it is useful. It enumerates the key, key id, and server time, and relates them to webhook verification. This is sufficient for an agent to understand the tool's role, though a bit more detail on the response structure could improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is nothing for the description to clarify. The baseline for 0 parameters is 4, and no additional parameter information is needed here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource being fetched: the public signing key, its key id, and server time. It also states the purpose of verifying webhook signatures, which helps distinguish it from siblings like set_webhook or get_statement. However, it lacks an explicit action verb, relying on the tool name for the 'get' semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Used to verify webhook signatures' implies a concrete use case for the tool. It does not explicitly describe when to use this tool versus alternatives, nor does it list exclusions or conditions. This is implied guidance rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_client_infoMonobank client infoARead-only
The token owner: name, accounts (with balances, credit limits, IBANs, masked card numbers), savings jars, and any FOP (sole proprietor) clients managed as an accountant. Balances are in major units (e.g. hryvnias). The bank allows one call per minute; repeated calls within 60 seconds return a cached copy, other calls wait for the slot.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description adds valuable operational context: a rate limit of one call per minute, cached responses within 60 seconds, queuing behavior for other calls, and that balances are in major units. It also discloses the full scope of what is returned, which is especially important given the lack of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact, information-dense sentences front-load the core purpose and immediately follow with the two most important behavioral caveats (units and rate limiting). There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return content, and it does so thoroughly: account details, card masks, jars, FOP clients, and balance units. It also covers caching/rate-limit behavior, making the tool safely invokable with no unexpected gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema already fully covers parameter semantics. Per the baseline for zero-parameter tools, no additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the exact resource (the token owner) and enumerates the returned data: name, accounts with balances/credit limits/IBANs/masked card numbers, savings jars, and FOP clients. This makes it unmistakably distinct from sibling tools like get_currency_rates or get_statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is for retrieving the token owner's client profile and related account data. However, it never explicitly states when to prefer this over siblings or mentions any exclusions, leaving usage selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_currency_ratesMonobank currency ratesARead-only
Public Monobank exchange rates (no token needed). A pair "USD/UAH" with buy 44.46 means the bank buys 1 USD for 44.46 UAH; sell is the price of 1 USD in UAH when the bank sells; cross is an indicative mid rate for pairs without buy/sell. Optionally filter by a currency alpha code such as USD or EUR. The bank refreshes this list at most every 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | ISO 4217 alpha code to filter by, e.g. "USD" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint; the description adds useful behavioral facts: authentication is not required, the data is refreshed at most every 5 minutes, and buy/sell/cross have defined meanings. It does not discuss error cases or response format, but these are minor for a public read-only endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: public access, semantics of the returned fields, and filter/refresh behavior. The most important information is front-loaded in the first phrase.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only public API with one optional parameter and no output schema, the description covers the data semantics, authentication, and refresh behavior. It leaves out possible error conditions when filtering by an unknown code, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional parameter, so the schema already explains the ISO 4217 alpha code. The description adds 'optionally filter' and examples like USD or EUR, which is helpful but not substantial beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely as 'Public Monobank exchange rates' and explains what buy, sell, and cross mean, making the tool's scope clear. It stops short of a 5 because the text uses a noun phrase rather than an explicit verb like 'returns' or 'gets', although the tool name supplies the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: no token is needed, the data is public, refresh happens at most every 5 minutes, and an optional currency filter exists. It does not explicitly compare against alternatives, but the sibling tools are unrelated enough that no exclusion is necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statementMonobank statementARead-only
Transactions for one account or jar in a time window. Amounts are in major units; negative means money out. The window may span at most 31 days + 1 hour (2682000 seconds); ask for longer ranges in several calls, because the bank rate-limits this endpoint to one call per 60 seconds. The server waits for the next free slot for up to 35 seconds; beyond that it fails fast with the number of seconds to wait, so call it again after that delay. The response reports the exact window used, so chain windows with from = previous to. Use "0" as the account for the default account, or an account/jar id from get_client_info.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Window end, same formats; a bare YYYY-MM-DD means the end of that UTC day. Defaults to the start of the current minute | |
| from | Yes | Window start: unix seconds, YYYY-MM-DD (midnight UTC), or ISO 8601 datetime | |
| account | No | Account or jar id from get_client_info, or "0" for the default account | 0 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important runtime behavior: the server may wait up to 35 seconds for a rate-limit slot, can fail fast with a wait time, and the response reports the exact window used. It also clarifies amount units and sign conventions, which is highly useful contextual behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, units, window limit, rate limiting, retry semantics, chaining, and account selection are all covered without filler. The most identifying information is placed first, and the rest builds logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the hard-to-discover operational details needed to invoke the tool correctly, including rate limits, retries, window chaining, and account id handling. There is no output schema, so a fuller description of the transaction response fields would make it fully complete, but the key return semantics are already stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the description does not need to repeat formats and defaults. It adds extra value by explaining the maximum window span, chaining windows with from = previous to, and account selection, which are meaningful constraints beyond the raw schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns transactions for one account or jar within a time window, which is a specific resource and action. It is easy to distinguish from sibling tools such as get_currency_rates, get_bank_public_key, and set_webhook because it uniquely handles transaction history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong operational guidance: maximum window size, rate limiting, retry behavior, and how to chain calls. It also explains how to select the account using get_client_info, but it does not explicitly state when to prefer an alternative sibling over this tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_webhookSet Monobank webhookADestructiveIdempotent
Replace the single webhook URL on the token owner's profile; any previously registered URL stops receiving events. The bank sends StatementItem events for every balance change on accounts and jars, after first probing the URL with a GET that must answer HTTP 200. Pass an empty string to remove the webhook. Check get_client_info first if the existing webhook matters.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | HTTPS URL that answers GET and POST with HTTP 200, or "" to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses that any previously registered URL stops receiving events, that the bank first probes with a GET requiring HTTP 200, that StatementItem events are sent for every balance change, and that an empty string removes the webhook. These details are not present in the annotations, which only flag idempotence and destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information: replacement effect, probe/event behavior, removal, and pre-check advice. The destructive consequence is front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutating tool with no output schema, the description covers side effects, server behavior, removal semantics, and the relevant sibling check. An agent has everything needed to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the URL constraint and the empty-string disable behavior. The description reinforces these points but adds no new parameter-level meaning beyond what the input schema provides, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Replace the single webhook URL on the token owner's profile'. It clearly separates this mutating webhook tool from the read-only sibling tools and also covers the removal case with an empty string.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit pre-condition: 'Check get_client_info first if the existing webhook matters', pointing the agent to the right sibling before a destructive call. It also states the URL must answer a GET probe with HTTP 200, which is a concrete acceptance criterion for when the tool will succeed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
get_bank_public_key - First observed
get_client_info - First observed
get_currency_rates - First observed
get_statement - First observed
set_webhook
TDQS
Each tool targets a distinct concern: public rates, public key verification, client account data, webhook configuration, and transaction statements. There is no overlap or ambiguity between their purposes.
All read-oriented tools follow the consistent get_<resource> pattern, and the single mutating tool uses the equally clear set_webhook. The naming is predictable and immediately conveys the action and target.
Five tools is an appropriate, well-scoped surface for a Monobank integration. Each tool maps to a core API capability without unnecessary duplication or bloat.
The toolset covers the essential Monobank operations: rates, client info, statements, webhook setup, and the public key needed for webhook verification. There are no obvious dead ends or missing domain-critical operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Let AI agents query data and act across all your business apps via MCP.
Trade 16 crypto exchanges + MetaTrader 5 from your AI assistant via one MCP connection.
Personal finance for AI agents — onboard, import statements, categorize & budget over MCP.
Connect Exact Online to your AI assistant via MCP. Manage Exact Online with natural language.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables interaction with Monobank personal accounts through MCP tools to fetch client information, account details, and transaction statements for specified time periods.2192MIT
- AlicenseAqualityAmaintenanceEnables integration with Monobank API to check currency exchange rates, view account balances, and retrieve transaction statements through natural language queries.3787MIT
- FlicenseNot gradedqualityDmaintenanceExposes Monobank personal account data through MCP tools, allowing users to fetch client info, accounts, and jars. It also enables retrieving account statements for specific time periods.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to retrieve and format Monobank account statements and transactions by date range.144MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SqREL/monobank-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server