MCP App Store
Finance
Ledgy icon

Ledgy

by Borys Harholinskyi

Overview

Your personal finance advisor, with your full ledger at hand. Log expenses by voice, photo, or chat and let Ledgy categorize them. Set budgets per category or period and stay on track with proactive checks. Plan recurring income and expenses, and track your spending across any timeframe. Ask "am I overspending on dining this month?" or "how much can I afford to save in Q3?" and get advice grounded in your real data — not generic tips. 30+ tools covering accounts, transactions, budgets, categories, and receipts. Personally owned. Shareable when you want.

Tools

adjust_account_balance

ChatGPT
Record one or more account-rebalance entries in bulk (up to 1000). Each entry is a TransactionSyncDto with type=Adjustment (3) and a SIGNED amount (positive or negative). The only place a transaction may carry a negative amount. category_id and to_account_id must be null. Excluded from income/expense aggregates by default.

adjust_account_balance

ChatGPT
Record one or more account-rebalance entries in bulk (up to 1000). Each entry is a TransactionSyncDto with type=Adjustment (3) and a SIGNED amount (positive or negative). The only place a transaction may carry a negative amount. category_id and to_account_id must be null. Excluded from income/expense aggregates by default.

aggregate_transactions

ChatGPT
Group + sum transactions over a period with FX normalization. By default Transfer (type=2) and Adjustment (type=3) are excluded so income/expense numbers match the mobile UI. Set include_transfers / include_adjustments to true to include them, or set filter.type=[…] for explicit type filtering.

aggregate_transactions

ChatGPT
Group + sum transactions over a period with FX normalization. By default Transfer (type=2) and Adjustment (type=3) are excluded so income/expense numbers match the mobile UI. Set include_transfers / include_adjustments to true to include them, or set filter.type=[…] for explicit type filtering.

convert_currency

ChatGPT
Convert an amount between two ISO-4217 currencies using the latest FX rates. For bulk conversion across many transactions, prefer the 'currency' parameter on aggregate_transactions.

convert_currency

ChatGPT
Convert an amount between two ISO-4217 currencies using the latest FX rates. For bulk conversion across many transactions, prefer the 'currency' parameter on aggregate_transactions.

delete_accounts

ChatGPT
Soft-delete accounts in bulk (up to 1000). The sync layer cascades to dependent member rows automatically.

delete_accounts

ChatGPT
Soft-delete accounts in bulk (up to 1000). The sync layer cascades to dependent member rows automatically.

delete_budgets

ChatGPT
Soft-delete budgets in bulk (up to 1000).

delete_budgets

ChatGPT
Soft-delete budgets in bulk (up to 1000).

delete_categories

ChatGPT
Soft-delete custom categories in bulk (up to 1000). Existing transactions referencing the category are unaffected (the reference becomes orphaned and falls back to 'uncategorized' on the client).

delete_categories

ChatGPT
Soft-delete custom categories in bulk (up to 1000). Existing transactions referencing the category are unaffected (the reference becomes orphaned and falls back to 'uncategorized' on the client).

delete_category_groups

ChatGPT
Soft-delete category groups in bulk (up to 1000). Categories within the group remain (their CategoryGroupId becomes orphaned).

delete_category_groups

ChatGPT
Soft-delete category groups in bulk (up to 1000). Categories within the group remain (their CategoryGroupId becomes orphaned).

delete_groups

ChatGPT
Soft-delete groups in bulk (up to 1000). The sync layer cascades to dependent group-member and group-transaction rows.

delete_groups

ChatGPT
Soft-delete groups in bulk (up to 1000). The sync layer cascades to dependent group-member and group-transaction rows.

delete_recurring_transactions

ChatGPT
Soft-delete recurring transactions in bulk (up to 1000). Already-generated transaction instances are unaffected.

delete_recurring_transactions

ChatGPT
Soft-delete recurring transactions in bulk (up to 1000). Already-generated transaction instances are unaffected.

delete_tags

ChatGPT
Soft-delete tags in bulk (up to 1000). Tag links on existing transactions are preserved as-is — only the tag definition is tombstoned.

delete_tags

ChatGPT
Soft-delete tags in bulk (up to 1000). Tag links on existing transactions are preserved as-is — only the tag definition is tombstoned.

delete_transactions

ChatGPT
Soft-delete transactions in bulk (up to 1000). Works for any transaction type (expense, income, transfer, adjustment).

delete_transactions

ChatGPT
Soft-delete transactions in bulk (up to 1000). Works for any transaction type (expense, income, transfer, adjustment).

download_receipt

ChatGPT
Returns a short-lived signed URL (60 min) to download the receipt attached to a transaction. The URL points directly at Google Cloud Storage — fetch via plain HTTPS GET. Returns null if the transaction has no receipt or the file metadata is missing.

download_receipt

ChatGPT
Returns a short-lived signed URL (60 min) to download the receipt attached to a transaction. The URL points directly at Google Cloud Storage — fetch via plain HTTPS GET. Returns null if the transaction has no receipt or the file metadata is missing.

get_account_balance

ChatGPT
Returns the live computed balance for one or more accounts using the same formula as the mobile UI: initial_balance + income - expense - transfers_out + transfers_in + adjustments. Each account's balance is in its own currency; pass currency to also get a converted figure per account. Pass account_ids to filter, or omit to receive every account. Set include_unassigned to surface income/expense transactions that have no account assigned (rendered as a synthetic 'Unassigned' bucket).

get_account_balance

ChatGPT
Returns the live computed balance for one or more accounts using the same formula as the mobile UI: initial_balance + income - expense - transfers_out + transfers_in + adjustments. Each account's balance is in its own currency; pass currency to also get a converted figure per account. Pass account_ids to filter, or omit to receive every account. Set include_unassigned to surface income/expense transactions that have no account assigned (rendered as a synthetic 'Unassigned' bucket).

get_transaction

ChatGPT
Returns a single transaction by sync_id with full details.

get_transaction

ChatGPT
Returns a single transaction by sync_id with full details.

get_transactions

ChatGPT
List transactions with rich filters (date range, type, accounts, categories, group_ids, amount range). Returns a page sorted by date desc; pass the cursor from a previous response to fetch the next page. Combining a date range with an amount range is rejected (400) — use aggregate_transactions for that intent. Filtering by group_ids resolves through the user-group-transactions junction (an M2M link, since Transaction has no direct groupId field) and uses in-memory pagination.

get_transactions

ChatGPT
List transactions with rich filters (date range, type, accounts, categories, group_ids, amount range). Returns a page sorted by date desc; pass the cursor from a previous response to fetch the next page. Combining a date range with an amount range is rejected (400) — use aggregate_transactions for that intent. Filtering by group_ids resolves through the user-group-transactions junction (an M2M link, since Transaction has no direct groupId field) and uses in-memory pagination.

get_user_profile

ChatGPT
Returns the user's profile settings: primary currency, week-start day, app language, date format, decimal places, and timezone offset.

get_user_profile

ChatGPT
Returns the user's profile settings: primary currency, week-start day, app language, date format, decimal places, and timezone offset.

list_accounts

ChatGPT
Returns the user's accounts (personal + shared) paginated. Personal accounts paginated server-side; shared accounts (where you're a non-owner member) paginated independently via shared_cursor. SharedItems and PersonalItems each carry their own NextCursor / HasMore — page each axis independently.

list_accounts

ChatGPT
Returns the user's accounts (personal + shared) paginated. Personal accounts paginated server-side; shared accounts (where you're a non-owner member) paginated independently via shared_cursor. SharedItems and PersonalItems each carry their own NextCursor / HasMore — page each axis independently.

list_budgets

ChatGPT
Returns the user's configured budgets paginated. Ordered by createdAt ASC + syncId tiebreaker (Name is optional and can't be used as a stable cursor field).

list_budgets

ChatGPT
Returns the user's configured budgets paginated. Ordered by createdAt ASC + syncId tiebreaker (Name is optional and can't be used as a stable cursor field).

list_categories

ChatGPT
Returns the user's categories paginated. Custom categories are paginated server-side (custom_cursor); custom category groups are paginated independently (groups_cursor). Well-known categories are returned only on the first response (when custom_cursor is null) — they're a static set, not paginated.

list_categories

ChatGPT
Returns the user's categories paginated. Custom categories are paginated server-side (custom_cursor); custom category groups are paginated independently (groups_cursor). Well-known categories are returned only on the first response (when custom_cursor is null) — they're a static set, not paginated.

list_groups

ChatGPT
Returns the user's groups paginated. Personal groups paginated server-side (cursor); shared groups paginated independently (shared_cursor). Members are joined per-page via a chunked WhereIn query — never a full-collection scan.

list_groups

ChatGPT
Returns the user's groups paginated. Personal groups paginated server-side (cursor); shared groups paginated independently (shared_cursor). Members are joined per-page via a chunked WhereIn query — never a full-collection scan.

list_recurring_transactions

ChatGPT
Returns the user's configured recurring transactions paginated. Ordered by nextOccurrence ASC + syncId tiebreaker (so upcoming items appear first). Type is 'income' | 'expense' | 'transfer'.

list_recurring_transactions

ChatGPT
Returns the user's configured recurring transactions paginated. Ordered by nextOccurrence ASC + syncId tiebreaker (so upcoming items appear first). Type is 'income' | 'expense' | 'transfer'.

list_supported_icons

ChatGPT
Returns the FontAwesome icon catalog and the brand color palette accepted by Icon/Color fields on accounts, categories, category groups, and groups. Validate icon/color values BEFORE setting them on entities.

list_supported_icons

ChatGPT
Returns the FontAwesome icon catalog and the brand color palette accepted by Icon/Color fields on accounts, categories, category groups, and groups. Validate icon/color values BEFORE setting them on entities.

list_tags

ChatGPT
Returns the user's tags paginated. Set include_usage=true to also compute the usage count per tag for the current page (one Firestore aggregation query per tag in the page; off by default to keep the common path fast).

list_tags

ChatGPT
Returns the user's tags paginated. Set include_usage=true to also compute the usage count per tag for the current page (one Firestore aggregation query per tag in the page; off by default to keep the common path fast).

reconcile_account

ChatGPT
Bring an account's computed balance in line with an external figure (e.g. the bank app's screen) by creating a single signed adjustment entry. Computes delta = expected_balance - current_balance and posts it as a type=Adjustment transaction. Returns the previous and new balance plus the adjustment sync_id. NOT idempotent — calling twice creates two adjustments.

reconcile_account

ChatGPT
Bring an account's computed balance in line with an external figure (e.g. the bank app's screen) by creating a single signed adjustment entry. Computes delta = expected_balance - current_balance and posts it as a type=Adjustment transaction. Returns the previous and new balance plus the adjustment sync_id. NOT idempotent — calling twice creates two adjustments.

transfer_between_accounts

ChatGPT
Record one or more account-to-account transfers in bulk (up to 1000). Each transfer is ONE transaction with type=Transfer, AccountId=source, ToAccountId=destination, CategoryId=null. Cross-currency transfers MUST set both exchange_rate and converted_amount (positive, in destination currency); same-currency transfers MUST leave both null.

transfer_between_accounts

ChatGPT
Record one or more account-to-account transfers in bulk (up to 1000). Each transfer is ONE transaction with type=Transfer, AccountId=source, ToAccountId=destination, CategoryId=null. Cross-currency transfers MUST set both exchange_rate and converted_amount (positive, in destination currency); same-currency transfers MUST leave both null.

update_user_settings

ChatGPT
Update one or more fields of the user's profile settings (primary currency, week-start day, language, etc.). Pass only the fields you want to change; nulls preserve current values. Settings are a per-user singleton — there is exactly one row.

update_user_settings

ChatGPT
Update one or more fields of the user's profile settings (primary currency, week-start day, language, etc.). Pass only the fields you want to change; nulls preserve current values. Settings are a per-user singleton — there is exactly one row.

upload_receipt

ChatGPT
Attach a receipt (JPEG/PNG/HEIC/WebP image or PDF) to an existing transaction. Server fetches the file from the provided HTTPS URL. Max 10MB; identical files (SHA-256) are deduplicated against the user's existing files; replaces any prior receipt on the same transaction. If the file is not yet at a public URL (e.g. it's a chat-attached photo), upload it first to a public host (Dropbox, Imgur, signed cloud-storage URL, etc.) and pass that URL.

upload_receipt

ChatGPT
Attach a receipt (JPEG/PNG/HEIC/WebP image or PDF) to an existing transaction. Server fetches the file from the provided HTTPS URL. Max 10MB; identical files (SHA-256) are deduplicated against the user's existing files; replaces any prior receipt on the same transaction. If the file is not yet at a public URL (e.g. it's a chat-attached photo), upload it first to a public host (Dropbox, Imgur, signed cloud-storage URL, etc.) and pass that URL.

upsert_accounts

ChatGPT
Create or update accounts in bulk (up to 1000). Items without sync_id create new accounts; items with sync_id update existing ones. Live balance is derived from transactions; only InitialBalance is editable here.

upsert_accounts

ChatGPT
Create or update accounts in bulk (up to 1000). Items without sync_id create new accounts; items with sync_id update existing ones. Live balance is derived from transactions; only InitialBalance is editable here.

upsert_budgets

ChatGPT
Create or update budgets in bulk (up to 1000). Period is an integer enum: 0=Weekly, 1=Monthly, 2=Quarterly, 3=Yearly.

upsert_budgets

ChatGPT
Create or update budgets in bulk (up to 1000). Period is an integer enum: 0=Weekly, 1=Monthly, 2=Quarterly, 3=Yearly.

upsert_categories

ChatGPT
Create or update custom categories in bulk (up to 1000). Type is 'income' or 'expense'. Well-known categories are read-only — use upsert_categories only for user-custom categories.

upsert_categories

ChatGPT
Create or update custom categories in bulk (up to 1000). Type is 'income' or 'expense'. Well-known categories are read-only — use upsert_categories only for user-custom categories.

upsert_category_groups

ChatGPT
Create or update category groups in bulk (up to 1000).

upsert_category_groups

ChatGPT
Create or update category groups in bulk (up to 1000).

upsert_groups

ChatGPT
Create or update groups in bulk (up to 1000). Plain group CRUD only — sharing-token generation and member invites stay excluded from MCP.

upsert_groups

ChatGPT
Create or update groups in bulk (up to 1000). Plain group CRUD only — sharing-token generation and member invites stay excluded from MCP.

upsert_recurring_transactions

ChatGPT
Create or update recurring transactions in bulk (up to 1000). Type is 'income' | 'expense' | 'transfer'. Frequency enum: 0=Daily, 1=Weekly, 2=BiWeekly, 3=Monthly, 4=Quarterly, 5=Yearly, 6=Custom.

upsert_recurring_transactions

ChatGPT
Create or update recurring transactions in bulk (up to 1000). Type is 'income' | 'expense' | 'transfer'. Frequency enum: 0=Daily, 1=Weekly, 2=BiWeekly, 3=Monthly, 4=Quarterly, 5=Yearly, 6=Custom.

upsert_tags

ChatGPT
Create or update tags in bulk (up to 1000). Each item without a sync_id creates a new tag; with a sync_id it updates. Use list_tags to discover existing sync_ids.

upsert_tags

ChatGPT
Create or update tags in bulk (up to 1000). Each item without a sync_id creates a new tag; with a sync_id it updates. Use list_tags to discover existing sync_ids.

upsert_transactions

ChatGPT
Create or update income/expense transactions in bulk (up to 1000). For transfers use transfer_between_accounts; for account rebalance use adjust_account_balance. Items without sync_id create; items with sync_id update. account_id is optional — null means 'unassigned' (no specific account).

upsert_transactions

ChatGPT
Create or update income/expense transactions in bulk (up to 1000). For transfers use transfer_between_accounts; for account rebalance use adjust_account_balance. Items without sync_id create; items with sync_id update. account_id is optional — null means 'unassigned' (no specific account).

Capabilities

Writes

App Stats

70

Tools

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily