MCPサーバー

cashflow

io.github.theluckystrike/cashflow
データ・分析 金融・投資 公開・接続可能 MCP 2026-07-28

このMCPでできること

Imports bank CSV data, applies transaction categories, summarizes cash flow by currency, detects recurring charges, and reconciles expenses.

accounts_list
List accounts
List the imported accounts: bank, currencies, transaction count, first and last date, and the closing balance when the file carried one. Start here for the account names transactions_list and statement_export take.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
bank_delete_upload
Delete an uploaded statement
Delete one statement file stored for your token. The transactions already imported from it are kept; transactions_list and the summary still see them.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 70, 'minLength': 1}}, 'additionalProperties': False}
bank_files
List uploaded statements
List the statement files stored for your token, with their sizes.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
bank_upload
Upload a bank statement file
Send a bank export to this hosted endpoint. There is no filesystem here, so instead of a path you upload the file once with bank_upload and then pass its name as `path` to statement_import. Give exactly one of content (the export as text, header row included - this is the normal case for a CSV), content_base64 (the file's bytes, which keeps a UTF-16 export from Excel readable) or url. url: fetch a public file instead of pasting base64 (recommended above about 10 KB): the url is fetched here with a 10 second timeout, at most 3 redirects, public http(s) hosts only, and a 1 MB cap; the fetched file has to be delimited text, so a PDF statement is refused rather than stored. Uploads are kept for your token between calls; bank_files lists them and bank_delete_upload removes one. The request body cap is 256 KB, so a large export pasted as text has to be split by month.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'url': {'type': 'string', 'description': "url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused"}, 'name': {'type': 'string', 'maxLength': 70, 'minLength': 1, 'description': 'Name to refer to this statement by: 1-64 characters of letters, digits, underscore or dash, e.g. "september"'}, 'content': {'type': 'string', 'description': 'The export as text, including the header row'}, 'content_base64': {'type': 'string', 'description': "The file's bytes, base64-encoded, instead of text"}}, 'additionalProperties': False}
category_rules
Set or list category rules
Read the category rules, or pass rules to REPLACE the whole list. A plain match is a substring; a regex compiles only if it cannot backtrack exponentially. An empty match is refused. Free: 5 rules.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'rules': {'type': 'array', 'items': {'type': 'object', 'required': ['match', 'category'], 'properties': {'match': {'type': 'string', 'maxLength': 200, 'description': 'Text to look for in the counterparty or description, e.g. "spotify"'}, 'regex': {'type': 'boolean', 'description': 'Treat match as a regular expression. A pattern that can backtrack exponentially is refused and used as a substring instead'}, 'category': {'type': 'string', 'maxLength': 120, 'description': 'Category to set, e.g. "software"'}}, 'additionalProperties': False}, 'description': 'The complete rule list; it replaces the stored one. Omit to list the current rules'}, 'reapply_all': {'type': 'boolean', 'description': 'Also overwrite categories set by an earlier rule or by hand. Default false: only uncategorised transactions are touched'}}, 'additionalProperties': False}
license_activate
Activate license
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['key'], 'properties': {'key': {'type': 'string', 'description': 'License key from checkout, MCPL1.<payload>.<signature>'}}, 'additionalProperties': False}
license_status
License status
Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
reconcile_expenses
Reconcile against the expense ledger
Match bank debits against mcp-expense-tracker entries: same currency and amount, date within a few days. Reports matches, unmatched bank lines, expenses never hitting the bank. Read-only. Free: 31 days; Pro: any range.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Limit to one bank account'}, 'window_days': {'type': 'integer', 'maximum': 31, 'minimum': 0, 'description': 'Allowed gap between the expense date and the bank date, default 3. A card payment usually settles a day or two after the receipt'}}, 'additionalProperties': False}
recurring_detect
Subscriptions and recurring charges in the bank data
Find charges that come back: debits grouped by counterparty and currency with a steady amount and interval, with cadence, typical amount, next due date and annual cost. Free: 3 months, 5 charges.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'months': {'type': 'integer', 'maximum': 60, 'minimum': 1, 'description': 'How far back to look, default 3. Two occurrences are enough to see a cadence, three make it certain'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Limit to one account'}, 'min_occurrences': {'type': 'integer', 'maximum': 24, 'minimum': 2, 'description': 'Occurrences required before a charge counts as recurring, default 2'}}, 'additionalProperties': False}
statement_export
Export bank transactions to a file
Export the BANK transactions of a date range (a month, a quarter, a year) as .csv or .json and return a download link valid for one hour. This is the tool for "export September" once a statement has been imported. Nothing partial is ever written.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['from', 'to', 'format', 'path'], 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'path': {'type': 'string', 'maxLength': 4096, 'description': 'Name for the downloaded file, e.g. september. It comes back as a download link valid for one hour'}, 'format': {'enum': ['csv', 'json'], 'type': 'string', 'description': 'csv for a spreadsheet, json for a program'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Limit to one account'}, 'category': {'type': 'string', 'maxLength': 500, 'description': 'Limit to one category'}}, 'additionalProperties': False}
statement_import
Import a bank CSV
Call this tool to read a bank CSV into the local ledger. Columns detected from headers (date, description, amount, currency, balance); amounts use the file's locale; stored lines skipped. Returns detected/stored/skipped.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['path'], 'properties': {'bank': {'enum': ['auto', 'revolut', 'wise', 'mbank', 'pko', 'ing', 'n26', 'generic'], 'type': 'string', 'description': 'Bank profile. Default "auto": the headers decide. "generic" skips profile detection and uses the header heuristics alone'}, 'path': {'type': 'string', 'maxLength': 4096, 'description': 'Name of a statement uploaded with bank_upload'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Name for this account, e.g. "business EUR". Default: the file name without its extension. Later imports of the same account are deduplicated against it'}, 'currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$', 'description': "Currency for rows where the file names none. Defaults to the shared business profile's default_currency, else EUR; the response says which it used"}, 'overwrite': {'type': 'boolean', 'description': 'Delete every transaction already stored for this account before importing, instead of merging. Use it when the bank reissued a corrected export'}}, 'additionalProperties': False}
statement_summary
What I spent, from the bank account
What was spent/received in a date range per the BANK ACCOUNT, grouped by category, month, account or counterparty. For "what did I spend in August" once imported. Totals are per currency, never summed or converted.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive. Default: today'}, 'top': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Groups returned per currency, largest net first. Default 25'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive. Default: the start of the current month'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Limit the summary to one account'}, 'group_by': {'enum': ['category', 'month', 'account', 'counterparty'], 'type': 'string', 'description': 'Default category'}}, 'additionalProperties': False}
transaction_categorize
Categorise transactions by id
Set or clear the category on transactions by id, for a one-off no rule is worth writing for. Every id is checked first, so one unknown id refuses the whole call. category_rules matches by text instead.
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ids', 'category'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string', 'maxLength': 64}, 'minItems': 1, 'description': 'Transaction ids, as returned by transactions_list or transactions_search'}, 'category': {'type': 'string', 'maxLength': 120, 'description': 'Category to set. Pass an empty string to clear it'}}, 'additionalProperties': False}
transactions_list
List transactions
List stored transactions in a date range, optionally for one account or category, or only the ones no rule has categorised yet. Totals are reported per currency and never added across currencies.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'ISO date YYYY-MM-DD, inclusive. Default: today'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'ISO date YYYY-MM-DD, inclusive. Default: the start of the current month'}, 'limit': {'type': 'integer', 'maximum': 1000, 'minimum': 1, 'description': 'Rows returned, default 200. Totals always cover the whole range'}, 'account': {'type': 'string', 'maxLength': 120, 'description': 'Limit to one account, as named at import'}, 'category': {'type': 'string', 'maxLength': 500, 'description': 'Only transactions in this category'}, 'uncategorized': {'type': 'boolean', 'description': 'Only transactions with no category yet'}}, 'additionalProperties': False}
transactions_search
Search transactions
Find transactions whose description, counterparty, category or account contains the query. Case-insensitive substring search, never a regex, so a query with brackets in it cannot hang the server.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'to': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'from': {'type': 'string', 'maxLength': 10, 'description': 'ISO date, inclusive'}, 'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Rows returned, default 100'}, 'query': {'type': 'string', 'maxLength': 200, 'description': 'Text to look for, e.g. "spotify" or "acme"'}}, 'additionalProperties': False}
追加
bank_delete_upload
2026年9月24日2:40
追加
bank_files
2026年9月24日2:40
追加
bank_upload
2026年9月24日2:40
追加
license_activate
2026年9月24日2:40
追加
license_status
2026年9月24日2:40
追加
accounts_list
2026年9月24日2:40
追加
statement_export
2026年9月24日2:40
追加
recurring_detect
2026年9月24日2:40
追加
reconcile_expenses
2026年9月24日2:40
追加
statement_summary
2026年9月24日2:40
追加
transaction_categorize
2026年9月24日2:40
追加
category_rules
2026年9月24日2:40
追加
transactions_search
2026年9月24日2:40
追加
transactions_list
2026年9月24日2:40
追加
statement_import
2026年9月24日2:40