ZenMoney MCP Server
You can audit, explore, and correct ZenMoney data through MCP, with previews before writes.
Sync ZenMoney history into a local cache, optionally refetching everything.
List categories with hierarchy and human-readable paths.
Find transactions by date, account, merchant, payee, MCC, uncategorized, or needs-review status.
Inspect merchant history with category counts, totals, and examples.
Review expenses and get ranked category candidates for uncategorized or suspicious transactions.
Apply category changes only after a dry-run preview and user confirmation.
Import Ozon Bank PDF statements with date + amount deduplication and dry-run preview.
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., "@ZenMoney MCP ServerReview my expenses from last week and suggest category fixes"
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.
An MCP server for ZenMoney: it audits expenses, finds transactions with no category or a doubtful one, fixes categories and imports the missing transactions from an Ozon Bank PDF statement. Claude makes the call in the conversation, the server gives it the history and the candidates.
How it works
Claude ──MCP/stdio──▶ zen-money-mcp ──HTTPS──▶ ZenMoney API (diff v8)
│
▼
local cache in node:sqlite
the whole history, then only changesThe ZenMoney history is loaded into a local cache once, then only changes are pulled.
The server doesn't pick a category itself. From the history of the place (merchant, then payee, then MCC) it ranks candidates with a confidence, weighing recency, the day of week and the amount range. Claude picks.
Nothing is written without a confirmation: the writing tools default to a preview (
dryRun: true).
Related MCP server: local-budget
Tools
Tool | What it does |
| Pulls changes into the cache, |
| Categories with their hierarchy and paths, |
| Search by period, account, merchant, payee, MCC, uncategorized or doubtful |
| The whole category history of a place: counts, amounts, examples |
| Audit of a period: uncategorized or suspicious expenses with ranked candidates |
| Writes categories, shows "before → after" first |
| Imports an Ozon Bank PDF statement: duplicates by date and amount are skipped, new ones have no category |
A typical session: "Check my expenses for last week". Claude calls zen_sync and zen_review_expenses, suggests fixes, zen_apply_categories with dryRun: true shows the changes, and after your "yes" the same call with dryRun: false writes them.
Setup
Node 26 or newer: the cache lives in the built-in node:sqlite.
Register an OAuth app at developers.zenmoney.ru (or
.app) and get its consumer key and secret. Its redirect URI ishttp://localhost:53682/callback.Sign in once in a terminal:
ZEN_CLIENT_ID=… ZEN_CLIENT_SECRET=… npx -y @aimuzov/zen-money-mcp authA browser opens, and after sign-in the token is saved to the data directory. It refreshes itself afterwards.
Add the server to your MCP config, see .mcp.json.example:
{ "mcpServers": { "zen-money": { "command": "npx", "args": ["-y", "@aimuzov/zen-money-mcp"], "env": { "ZEN_CLIENT_ID": "your-consumer-key", "ZEN_CLIENT_SECRET": "your-consumer-secret", "ZEN_ENDPOINT": "ru" } } } }
Without a token the tools answer with a hint to run zen-money-mcp auth. There is no hosted connector: the server runs over stdio only and the data stays on your machine.
Commands
Usage: zen-money-mcp [serve|auth|sync [--full]|--help|--version]
serve run the MCP server over stdio (default)
auth sign in to ZenMoney in the browser and save the token
sync pull changes from ZenMoney into the local cache, --full refetches everythingEnvironment
Variable | Default | What it does |
| The OAuth app, needed to sign in and refresh | |
|
|
|
|
| Port of the |
| The full callback URI when the app has another one | |
|
| The |
|
|
|
| Error reports to Sentry, release |
They may also live in .env at the package root, the environment wins over the file.
Development
npm start # the server over stdio straight from src/
npm test # node --test
npm run typecheck
npm run lint
npm run format # oxlint --fix and prettier
npm run build # build/ for npmShared helpers and the CI steps come from infra-mcp-kit, formatting and lint rules from infra-site-kit. Times in the cache are Unix seconds, like in the API.
License
Available Tools
7 toolszen_apply_categoriesApply category changesA
Write category changes back to ZenMoney. ALWAYS call with dryRun:true first (the default) to preview before -> after, present that list to the user, and only call again with dryRun:false after the user explicitly confirms. tagId null clears the category.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only (default true). Set false to actually write. | |
| changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by disclosing the two-phase dry-run workflow, the default preview mode, the need for explicit confirmation, and that tagId null clears the category. It does not cover permissions, reversibility, or error behavior, but the critical mutation safety behavior is clear.
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 three short sentences and front-loads the core write behavior and safety protocol. Every sentence adds actionable information with no waste.
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 mutation tool with no annotations and no output schema, the description provides enough behavioral context to call it safely: dry-run first, show preview, confirm, then write. It could be more complete about response format or failure modes, but the essential safety contract is present.
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 50%, with dryRun already documented in the schema. The description adds useful meaning for dryRun's workflow role and for tagId null clearing the category, but it does not explain the changes array structure or transactionId semantics.
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 states a specific verb and resource: writing category changes back to ZenMoney. It is clearly a mutation tool and distinct from likely read-oriented siblings such as zen_review_expenses and zen_find_transactions, though it does not explicitly name those alternatives.
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 workflow: always call with dryRun:true first, present the preview, and only call with dryRun:false after explicit user confirmation. It does not contrast with sibling tools, but the procedural guidance is clear and strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_find_transactionsFind transactionsB
Flexible filtered transaction lookup (newest first). Filter by date range, account, merchant/payee/mcc, uncategorized-only, or needs-review-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| mcc | No | ||
| from | No | ||
| limit | No | ||
| payee | No | ||
| account | No | ||
| merchant | No | ||
| minOutcome | No | ||
| needsReviewOnly | No | ||
| uncategorizedOnly | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden. It does add one genuine behavioral fact — results are returned newest-first — but says nothing about the default result count, whether the 1–500 limit is paginated, what authentication/scope applies, or what the response contains. For a 10-parameter query tool with zero annotation coverage this is thin.
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?
A single front-loaded sentence names the operation and ordering, then a second sentence enumerates filters. No filler, no redundancy, and the most important scoping facts come first.
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, no annotations, and 10 parameters at 0% coverage, the description should tell the agent more — notably the date string format, what minOutcome/limit mean, and whether results are truncated. It is adequate to start an invocation but not sufficient to call confidently without guessing.
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 0%, so the description must compensate — and it does map 8 of 10 parameters to meaning: 'date range' clarifies from/to as dates, 'merchant/payee/mcc' disambiguates three similar string/number fields, and the two '*-only' booleans are explained by name. It leaves 'limit' (bounds are in schema but no default/reset behavior) and 'minOutcome' entirely unexplained, which is the gap keeping this below 5.
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 ('filtered transaction lookup') plus the ordered semantics ('newest first'), and enumerates the filter axes, so an agent can tell this is a read/find tool. It does not, however, distinguish itself from siblings like zen_review_expenses or zen_merchant_history, which overlap on transaction 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?
The filter list implies when the tool is useful ('uncategorized-only', 'needs-review-only' hint at review workflows) but never states when to prefer it over zen_review_expenses or zen_merchant_history, nor any exclusions or prerequisites. Usage must be inferred from the parameter names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_import_statementImport bank statementA
Import missing transactions from an Ozon-bank PDF statement into a ZenMoney account. Deduplicates against existing transactions by date + amount; credit repayments (transfers) are never created. ALWAYS call with dryRun:true first (the default) to preview the plan, present it to the user, and only call again with dryRun:false after explicit confirmation. New transactions are created without a category (run zen_review_expenses afterwards).
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only (default true). Set false to actually write. | |
| account | Yes | Target account id (exact) | |
| filePath | Yes | Absolute path to the PDF statement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses dedup by date + amount, that credit repayments/transfers are never created, and that new transactions land without a category. It omits permissions/auth requirements, whether re-running is idempotent beyond dedup, and failure modes for malformed PDFs.
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 sentences, no filler, front-loaded with purpose then the mandatory safety workflow then the follow-up tool. Every sentence carries actionable 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?
A mutation tool with no annotations and no output schema, yet the purpose, the safety protocol, the dedup semantics, and the follow-up step are all covered. The only gap is what the dry-run plan output actually looks like, which would help the agent present it to the user.
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 baseline is 3, but the description adds real meaning: dryRun defaults to true and must be sequenced deliberately, and filePath is constrained to an Ozon-bank PDF. That is more than restating 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?
Names a specific verb (import) and resource (transactions from an Ozon-bank PDF statement into a ZenMoney account), plus the exact scope: missing transactions only, deduplicated by date + amount. This clearly separates it from zen_sync (general sync) and zen_find_transactions (read-only lookup).
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?
Prescribes an explicit two-step workflow: dryRun:true first, present the plan to the user, then dryRun:false only after explicit confirmation. It also routes follow-up work to zen_review_expenses for categorization, so the agent knows both when to call this and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_list_categoriesList categoriesB
The category (tag) vocabulary with hierarchy and human-readable paths. Use the ids when proposing category changes.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by category kind (default outcome) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden; 'vocabulary' and 'list' imply a read-only lookup, and the mention of hierarchy and human-readable paths gives some sense of the returned content. However, it does not state pagination, caching, or whether the result is a flat set or nested tree, leaving meaningful behavioral gaps.
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 tight sentences with no filler, and the resource definition is front-loaded before the usage hint. The first sentence is a noun phrase rather than a verb-led statement, which slightly weakens the lead.
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 one-optional-param read tool with no output schema, the description should at least sketch the return shape; it hints at ids, paths, and hierarchy but does not say whether results is flat or nested or how many are returned. Adequate but not 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?
There is a single optional parameter whose schema description already documents the kind enum and its default of 'outcome'; description coverage is 100%. The description adds no additional meaning about filtering or what 'all' yields, so the baseline 3 applies.
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?
Identifies the resource precisely: the category (tag) vocabulary, including hierarchy and human-readable paths. It lacks an explicit verb like 'list/retrieve', but the content is concrete enough to separate it from sibling tools such as zen_apply_categories, which mutates rather than reads.
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 second sentence, 'Use the ids when proposing category changes', implies a workflow link to zen_apply_categories, but it never states when to call this tool versus the alternatives or what preconditions exist. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_merchant_historyMerchant historyA
Full historical category breakdown for a place (by merchant id, payee text, or mcc): how often each category was used, totals, and recent examples. Use to dig deeper when a review row is ambiguous.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| mcc | No | ||
| from | No | ||
| payee | No | ||
| merchant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavior, and it does disclose the shape of the response (frequencies, totals, recent examples), which signals a read-only analytical lookup. It does not state how 'recent examples' is bounded, whether any key is required, or what happens when several keys are supplied.
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 resource and its lookup keys, then the use case. Dense and largely waste-free, though the parenthetical key list sits awkwardly mid-sentence.
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?
All five params are optional, there is no output schema and no annotations, so the description should explain parameter interplay and defaults. It covers output content and intent but leaves date-range filtering and multi-key precedence unspecified.
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 0% across 5 params, and the description only accounts for three of them (merchant, payee, mcc). The from/to date-range parameters — potentially the key scoping inputs for a 'historical' tool — are never mentioned, leaving a real gap the schema does not fill.
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 resource and scope: historical category breakdown per merchant, with the three lookup keys (merchant id, payee text, mcc) and the returned content (usage frequency, totals, recent examples). It implicitly distinguishes itself from zen_review_expenses via 'when a review row is ambiguous,' though no sibling is named outright.
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?
'Use to dig deeper when a review row is ambiguous' gives a concrete triggering condition that routes the agent away from the review tool. No when-not guidance or explicit named alternative (e.g. zen_find_transactions vs this) is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_review_expensesReview expensesA
Audit expenses in a date range: returns those that are uncategorized or likely mis-categorized, each with the current category and ranked candidate categories (with confidence) inferred from history at the same place. YOU decide the final category from this evidence, then propose changes via zen_apply_categories. Run zen_sync first if the cache may be stale.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End date, inclusive (YYYY-MM-DD) | |
| from | Yes | Start date, inclusive (YYYY-MM-DD) | |
| limit | No | ||
| account | No | Limit to one account id | |
| includeOk | No | Also include expenses that look fine (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the return contents (current category, ranked candidates with confidence, inferred from history at the same place) and implicitly establishes that this tool is read-only — decisions and writes happen elsewhere. It is silent on ordering, truncation at the 300 limit, and any cost/latency of the history inference.
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, front-loaded with purpose, then output semantics, then the required next step. No filler and no repetition of schema fields.
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?
No output schema exists, and the description compensates by describing the returned shape and its meaning in enough detail to act on. The remaining gap is behavioral detail around limit/truncation and result ordering for a 5-parameter 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 coverage is 80%, so the baseline is 3; from/to are documented in the schema. The description only implicitly touches includeOk by framing the default as uncategorized/mis-categorized items, and says nothing about how limit or account interact with the audit output.
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 ('Audit expenses in a date range') and immediately defines the result set: uncategorized or likely mis-categorized items. This distinguishes it cleanly from siblings like zen_find_transactions (search) and zen_merchant_history (lookup history at one merchant).
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 routes the agent: it decides the final category itself and then proposes changes via zen_apply_categories, and should run zen_sync first if the cache may be stale. Both the next step and the prerequisite are named, so the workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zen_syncSync cacheA
Pull the latest data from ZenMoney into the local cache. Run this before auditing if the data may be stale. full:true re-fetches the entire history.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Re-fetch everything from scratch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it discloses that this writes to a local cache and that full:true re-fetches history, implying a heavier operation. It does not say whether local data is replaced or lost, how long a full sync takes, or whether concurrent reads are affected — meaningful gaps for an unannotated mutating tool.
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 short sentences, front-loaded with the action, then timing, then the parameter caveat. Nothing is redundant.
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 one-optional-param tool with no output schema, the essentials — what it does, when to run it, and what the flag changes — are all present. Only the side effects on existing cached data are left unstated.
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 single param is already described as "Re-fetch everything from scratch." The description's "full:true re-fetches the entire history" adds no meaning beyond that wording, so baseline 3 applies.
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: pulling ZenMoney data into the local cache. This clearly separates it from the sibling tools, which are query/analysis operations rather than a cache-priming sync, 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?
"Run this before auditing if the data may be stale" gives a concrete trigger condition tied to downstream work. It offers clear context but no explicit when-not-to-use guidance or named alternatives.
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.
7 tool updates
v1.0.5- First observed
zen_apply_categories - First observed
zen_find_transactions - First observed
zen_import_statement - First observed
zen_list_categories - First observed
zen_merchant_history - First observed
zen_review_expenses - First observed
zen_sync
TDQS
Scored across 7 tools
Core workflow tools (sync, review, apply, import) are clearly distinct, and descriptions explicitly chain them together. The only mild overlaps are zen_find_transactions with its needs-review/uncategorized filters versus zen_review_expenses, and zen_merchant_history versus the evidence already returned by review rows; descriptions largely disambiguate these.
All tools share a consistent zen_ prefix and mostly use verb_noun snake_case (review_expenses, apply_categories, import_statement, list_categories, find_transactions). Minor deviations: zen_sync is a bare verb, and zen_merchant_history is a noun phrase with no verb.
Seven tools is well within the ideal 3-15 range for a focused expense-categorization server. Each tool earns its place in the sync → review → evidence → apply loop, with no redundant entries.
The categorization lifecycle is well covered: cache refresh, filtered lookup, evidence gathering, category vocabulary, dry-run write-back, and statement import. Gaps exist beyond this scope — no account listing, no single-transaction create/edit/delete, and statement import is limited to Ozon-bank PDFs — but agents can work around them for the stated purpose.
Maintenance
Related MCP Connectors
Deterministic bank-statement parsing: messy CSV/OFX to clean categorized rows. In-memory only.
Import a bank CSV, categorise it, summarise it per currency and reconcile it against your expenses.
Import a bank CSV, categorise it, summarise it per currency and reconcile it against your expenses.
Import a bank CSV, categorise it, summarise it per currency and reconcile it against your expenses.
Related MCP Servers
- FlicenseBqualityBmaintenanceEnables read-only SQL queries and transaction classification tools for local expense tracking, including listing, filtering, and bulk account assignment with dry-run mode.8-
- AlicenseBqualityCmaintenanceEnables local-first personal finance management through deterministic tools for importing, categorizing, and analyzing bank transactions.36MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying your own local bank and credit card statement files (CSV or PDF) in plain language, so you can discover forgotten recurring subscriptions, compare spending across months and quarters, and look up transactions without any bank logins or network calls.MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to analyze a local bank statement CSV through seven tools covering spending by category, top merchants, recurring subscriptions, unusual or duplicate charges, end-of-month forecasts, and transaction search, plus a monthly review prompt. CSV files stay on the user's machine, with only aggregated results and matched transactions exposed to the assistant.7MIT