ameria-bank
Allows secure storage of refresh tokens and automatic token rotation via 1Password vault.
Click on "Deploy 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., "@ameria-bankShow my recent transactions"
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.
Unofficial. This project is not affiliated with, endorsed by, or associated with Ameria Bank. It is an independent open-source tool that uses the publicly accessible MyAmeria online banking interface.
Open-source MCP server for Ameria Bank online banking. Query your transaction history, account balances, and card info — all through AI assistants like Claude Desktop.
Read-only. This server only reads data from your accounts. It cannot initiate transfers, payments, or modify anything.
Available Tools
Tool | Description |
| Transaction history with date range and pagination |
| Search transactions by merchant/keyword |
| All accounts, cards, balances, overdraft info |
| Detailed balance breakdown for a specific card/account |
| Per-account transaction events with filtering |
Related MCP server: MBBank MCP Server
Setup
1. Get Your Refresh Token
The server uses a refresh token to automatically obtain short-lived access tokens. You only need to set this up once — the refresh token is long-lived and the server handles token rotation automatically.
Log in to MyAmeria
Open browser Developer Tools (F12 or Cmd+Option+I)
Go to the Network tab, filter by
tokenLook for a request to
account.myameria.am/auth/realms/ameria/protocol/openid-connect/tokenIn the response, copy the
refresh_tokenvalueStore it in a secure vault (1Password, macOS Keychain, etc.)
Note: The refresh token lasts much longer than the 15-minute access token. The server automatically refreshes the access token when it expires, so you don't need to manually update tokens for each session.
2. Configure Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Option A — Vault (recommended, token auto-rotates):
{
"mcpServers": {
"ameria-bank": {
"command": "node",
"args": ["/absolute/path/to/ameria-mcp/server.js"],
"env": {
"AMERIA_VAULT": "keychain",
"AMERIA_VAULT_KEY": "ameria-mcp"
}
}
}
}Option B — Env var (simpler, but tokens don't persist across rotations):
{
"mcpServers": {
"ameria-bank": {
"command": "node",
"args": ["/absolute/path/to/ameria-mcp/server.js"],
"env": {
"AMERIA_TOKEN": "your_refresh_token"
}
}
}
}Restart Claude Desktop after saving.
Usage Examples
Once connected, you can ask Claude things like:
"Show my recent transactions"
"How much did I spend on Yandex Go this month?"
"What are my card balances?"
"Show me all transactions over 10,000 AMD last week"
"What's my available balance on the Visa Signature card?"
"List all spending on groceries this month"
Environment Variables
Variable | Required | Description |
| Yes* | Refresh token from MyAmeria. *Not required if using a vault. |
| Yes* | Base64-encoded |
| Yes* | Client-Id header value for API calls. *Not required if using a vault. |
| No | Vault backend: |
| No | Item name in the vault (e.g. |
Vault Integration (Recommended)
Store the refresh token in a vault instead of an env var. The server reads from the vault on startup and automatically saves rotated refresh tokens back — so you never have to manually update the token again.
1Password
Requires the 1Password CLI (op) with biometric unlock or service account.
Create an item called
ameria-mcpin 1PasswordAdd these fields:
refresh_token— your refresh tokenclient_auth— Base64-encodedclient_id:client_secret(from the Authorization header in the token request)client_id— the Client-Id UUID (from the API request headers)
Configure Claude Desktop:
{
"mcpServers": {
"ameria-bank": {
"command": "node",
"args": ["/absolute/path/to/ameria-mcp/server.js"],
"env": {
"AMERIA_VAULT": "1password",
"AMERIA_VAULT_KEY": "ameria-mcp"
}
}
}
}The server reads refresh_token, client_auth, and client_id from the item via op item get and writes back rotated refresh tokens with op item edit.
macOS Keychain
Store the credentials:
security add-generic-password -s ameria-mcp -a refresh_token -w "YOUR_REFRESH_TOKEN" -U
security add-generic-password -s ameria-mcp -a client_auth -w "YOUR_BASE64_CLIENT_AUTH" -U
security add-generic-password -s ameria-mcp -a client_id -w "YOUR_CLIENT_ID_UUID" -UConfigure Claude Desktop:
{
"mcpServers": {
"ameria-bank": {
"command": "node",
"args": ["/absolute/path/to/ameria-mcp/server.js"],
"env": {
"AMERIA_VAULT": "keychain",
"AMERIA_VAULT_KEY": "ameria-mcp"
}
}
}
}The server reads refresh_token, client_auth, and client_id from Keychain (service=ameria-mcp) and writes back rotated refresh tokens automatically.
No Vault (env only)
If AMERIA_VAULT is not set, the server uses AMERIA_TOKEN env var directly. Rotated tokens are kept in memory only and not persisted — you'll need to update the token manually if the refresh token expires.
Development
git clone <repo-url>
cd ameria-mcp
npm installRun locally:
AMERIA_TOKEN=your_token node server.jsTest with MCP Inspector:
AMERIA_TOKEN=your_token npm run inspectRunning Tests
npm test104 tests covering all helper functions: date validation, card/account masking, currency grouping, transaction formatting, and error handling.
Claude Code
claude mcp add ameria-bank -- node /absolute/path/to/ameria-mcp/server.jsThen set AMERIA_TOKEN in your environment.
Security
Read-only — no write operations, no transfers, no payments
Access tokens auto-refresh — the server uses a refresh token to obtain short-lived access tokens automatically
Card numbers are masked — double-masked even though the API already partially masks them
30-second request timeout — prevents indefinite hangs
No data persistence — nothing is cached or stored locally
License
MIT
Available Tools
5 toolsget_account_eventsARead-onlyIdempotent
Get past events (transactions) for a specific Ameria Bank account. Filters by account and minimum amount. Use get_accounts_and_cards first to find the accountId — use the 'accountId' field from cards or 'id' field from accounts (e.g. '31023550200').
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starts at 1 (default: 1) | |
| size | No | Number of items per page, max 100 (default: 50) | |
| accountIds | Yes | Account ID to filter by (e.g. '31023550200' — from get_accounts_and_cards) | |
| fromAmount | No | Minimum transaction amount to include (default: 0.1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds useful context: the prerequisite lookup flow and where accountId comes from, plus the amount filter behavior. It doesn't cover pagination behavior, but schema param descriptions handle that.
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 sentences, front-loaded with the core operation, followed by the prerequisite. No filler. The example ID is helpful rather than wasteful, though marginally redundant with the schema example.
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?
Given readOnly/idempotent annotations and 100% schema coverage, the description covers purpose, prerequisite, and filter semantics adequately. Pagination is left to the schema, which is appropriate; nothing critical for a correct call is missing.
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%, so parameters are already documented. The description still adds value by giving a concrete example ('31023550200') and clarifying accountId provenance from cards/accounts, reinforcing the schema's parenthetical. Slightly beyond baseline but not exhaustive.
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?
States a specific verb+resource ('Get past events (transactions)') scoped to 'a specific Ameria Bank account,' and distinguishes itself from siblings like get_transactions/search_transactions by its account+amount filtering. An agent can identify the operation without opening the schema.
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?
Explicitly names the prerequisite tool ('Use get_accounts_and_cards first to find the accountId') and the exact source field, and states the filtering conditions. This is actionable when-to-use guidance, not mere implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accounts_and_cardsARead-onlyIdempotent
Get all accounts and cards from Ameria Bank. Returns balances, card types, statuses, overdraft info, and product IDs. Includes both Ameria cards and linked external cards. Call this FIRST to discover available account/card IDs before using get_available_balance or get_account_events.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuine context beyond that: it returns balances, card types, statuses, overdraft info and product IDs, and notably that results span both Ameria cards and linked external cards. It does not mention auth requirements or rate limits, but the added scope detail is meaningful.
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 tight sentences, each earning its place: purpose, return contents, and the ordering instruction. The most actionable guidance (call this first) is placed last where it caps the read.
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 burden of describing returns and does so well, listing the concrete fields. Minor gaps remain around pagination or failure behavior, but for a zero-param discovery call this is nearly complete.
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 takes zero parameters, so there is nothing to document and the baseline is 4. The description correctly avoids inventing filter semantics that the empty schema does not support.
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?
States a specific verb+resource (get all accounts and cards), names the source system, and enumerates the data returned. It explicitly distinguishes itself from siblings by positioning itself as the discovery step preceding get_available_balance and get_account_events.
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?
Explicitly says 'Call this FIRST to discover available account/card IDs before using get_available_balance or get_account_events,' naming the alternatives and the condition that selects them. The sequencing guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_available_balanceARead-onlyIdempotent
Get detailed balance breakdown for a specific card or account. Returns balance, available balance, frozen balance, and offline available amount. Use get_accounts_and_cards first to find the product ID.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | The product ID of the card or account (e.g. '1128773037' — get this from get_accounts_and_cards 'id' field) | |
| productType | No | Product type (default: 'CARD') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the dependency on get_accounts_and_cards and the shape of the returned figures, but no auth requirements, rate limits, or caching/freshness 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?
Three sentences, zero filler, and the core purpose plus return contents are front-loaded before the prerequisite note. Every sentence carries distinct 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, the description usefully enumerates the returned balance fields and covers the required-argument dependency, which is what an agent needs to call it. Minor gaps remain around error cases (invalid productId, mismatched productType) but the definition is otherwise sufficient for a simple read tool.
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 description coverage is 100%, and the schema already explains productId sourcing from get_accounts_and_cards as well as the CARD/ACCOUNT enum and its default. The description only restates that the product is a card or account, so it adds nothing beyond the structured fields — baseline 3.
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 names a specific verb and resource ('Get detailed balance breakdown for a specific card or account') and enumerates the returned fields (balance, available balance, frozen balance, offline available). It is clearly distinct from transaction- and event-oriented siblings, though it never names an alternative explicitly.
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 a concrete prerequisite flow: 'Use get_accounts_and_cards first to find the product ID,' which tells the agent how to obtain the required argument. It stops short of stating when not to use this tool or which sibling to prefer for other balance-like queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsARead-onlyIdempotent
Get transaction history from Ameria Bank. Returns a page of transactions within a date range. Defaults to last 30 days. Use page parameter to paginate — check hasNext in the response to know if more pages exist. For finding specific merchants, prefer search_transactions instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starts at 1 (default: 1) | |
| size | No | Number of items per page, max 100 (default: 50) | |
| toDate | No | End date in YYYY-MM-DD format (defaults to today) | |
| fromDate | No | Start date in YYYY-MM-DD format (defaults to 30 days ago) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-redundant behavior: the default 30-day window and the fact that pagination termination is signalled by a hasNext field in the response — valuable since there is no output schema. It stops short of describing the full response shape (transaction fields, totals, auth/rate limits), so it is strong but not complete.
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 short sentences, front-loaded with purpose and default behavior, then pagination, then the alternative-tool routing. Every sentence carries actionable information with no filler.
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 zero-required-param read-only listing tool with 100% schema coverage and annotations covering safety, the remaining agent needs — defaults and pagination termination — are both addressed. Missing only the response payload shape (what a transaction record contains), which matters somewhat given the absence of an output schema.
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 description coverage is 100% and each of the four parameters already documents its format, bounds and default in the schema, so the baseline is 3. The description's date-range default largely restates the fromDate/toDate schema defaults rather than adding syntax or edge-case guidance.
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?
States a specific verb and resource ('Get transaction history from Ameria Bank') plus the scope of the return ('a page of transactions within a date range'). It also names the sibling it is not ('prefer search_transactions'), so an agent can distinguish it from search_transactions without opening either schema.
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?
Gives explicit defaults ('Defaults to last 30 days'), pagination instructions ('Use page parameter to paginate — check hasNext'), and a concrete when-not-to-use rule routing merchant lookups to search_transactions. Nothing about selecting this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_transactionsARead-onlyIdempotent
Search Ameria Bank transactions by keyword within a date range. Filters against merchant names, transfer descriptions, and beneficiary names (case-insensitive). IMPORTANT: searches within a single page only — to find all matches, iterate through pages or use a larger page size. Useful for questions like 'how much did I spend on YANDEX this month?'.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starts at 1 (default: 1) | |
| size | No | Number of items per page, max 100 (default: 50) | |
| query | Yes | Search keyword to match against transaction details and beneficiary name (case-insensitive) | |
| toDate | No | End date in YYYY-MM-DD format (defaults to today) | |
| fromDate | No | Start date in YYYY-MM-DD format (defaults to 30 days ago) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the bar is lower — yet the description adds a genuinely non-obvious constraint: the search runs against a single page only. That caveat plus the case-insensitive matching rule materially change how an agent must call the tool and are not derivable from the annotations or 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?
Three tight sentences with no filler: purpose first, then the critical single-page caveat, then a concrete usage example. The most important constraint (single-page scope) 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?
With no output schema and a mutation-free read tool, the description covers purpose, matching semantics, date scoping, and pagination behavior — everything needed to invoke it correctly. It does not describe the shape of returned transaction records, but for a search over an annotated read-only endpoint 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%, so the baseline is 3. The description earns an extra point by expanding what 'query' actually matches — merchant names, transfer descriptions, beneficiary names — beyond the schema's terser 'transaction details and beneficiary name', and by tying the date parameters to the keyword search.
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?
States a specific verb and resource ('Search Ameria Bank transactions'), names the searchable fields (merchant names, transfer descriptions, beneficiary names), and scopes it to a date range. The keyword-search framing cleanly separates it from the sibling get_transactions, which implies unfiltered retrieval.
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?
Provides an explicit usage example ('how much did I spend on YANDEX this month?') and operational guidance to iterate pages or raise page size when full coverage is needed. It stops short of naming get_transactions as the alternative for unfiltered listing, so routing between siblings is left partly to inference.
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.
5 tool updates
v1.0.0- First observed
get_account_events - First observed
get_accounts_and_cards - First observed
get_available_balance - First observed
get_transactions - First observed
search_transactions
TDQS
Scored across 5 tools
get_transactions and get_account_events both retrieve transactions—one broadly, one per account—creating overlap. search_transactions provides keyword filtering but its single-page limitation blurs its boundaries with get_transactions. get_available_balance is distinct, but the transaction trio causes moderate ambiguity.
Most tool names follow a consistent verb_noun pattern (get_transactions, search_transactions, get_accounts_and_cards, get_available_balance, get_account_events). However, 'get_accounts_and_cards' deviates by returning two resource types, slightly breaking the pattern.
With only 5 tools, the set is well-scoped for a bank integration, covering browsing accounts, checking balances, and retrieving/searching transactions without bloat.
The surface covers read operations for accounts and transactions but lacks any write capabilities (e.g., transfers, payments) and missing account details like statements or card management. This is a notable gap for a banking domain.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server enabling AI agents to manage Bitrix24 features via standardized protocol
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
The Ramp MCP server enables users to securely connect Ramp with AI assistants like ChatGPT and Claude to query financial data and take actions using natural language. It transforms Ramp's developer API into a SQL interface that LLMs can query, allowing admins to analyze spend trends, identify cost savings, and run complex SQL analyses on comprehensive datasets (transactions, purchase orders, vendors, users), while all users can manage cards, view transactions, request reimbursements, and get expense policy answers.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP Server that provides a conversational interface to the UK Open Banking account information API, allowing agents to interact with bank account data through natural language commands.-
- AlicenseNot gradedqualityCmaintenanceMCP server that provides monitoring and analytics capabilities for MBBank accounts, allowing users to check balances, transaction history, card details, and savings information.7MIT
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to automate Cash App payments, balance checks, and transaction management via browser automation.138 npmMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to retrieve and format Monobank account statements and transactions by date range.5 npm4MIT