Convert a bank statement to a QBO file that QuickBooks imports, plus OFX.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user attaches a bank or credit card statement (text PDF, CSV or Excel export) and wants to convert the bank statement to a QBO file, or an OFX, QIF or QuickBooks CSV: "convert pdf to qbo", "bank statement to ofx", "csv to qif". Returns a QuickBooks Web Connect .qbo, OFX 1.0.2 and OFX 2 files, a QIF, a 3-column QuickBooks CSV and an Excel review sheet, with stable unique FITIDs, the statement period and the ending balance, and checks opening + transactions = closing. Does not read scans or photos (use generate_qbo_file with the rows you can read) and does not connect to banks or QuickBooks.
The statement to convert: a text PDF, or the CSV or Excel (.xlsx) export from online banking, e.g. chase-sept-2026.pdf.
Optional BANKID for the OFX files: the bank's 9-digit ABA number printed on checks, e.g. 121000248. Default 000000000.
ISO currency code, e.g. USD (default), CAD, GBP.
QuickBooks Web Connect bank id (INTU.BID) for the .qbo file. Default 3000. Use the id of your own bank if QuickBooks Desktop asks for a supported bank.
Order of numeric dates: MDY (default, US) or DMY. Detected from the file when a day is above 12.
Only for CSV/Excel card exports that list purchases as positive: true flips every amount. Default false.
checking (default), savings, money_market, credit_card or line_of_credit. auto reads it from a PDF statement. Example: credit_card.
Last 4 digits of the account (or any short label) used as the account id QuickBooks links to, e.g. 4821. Default 0000. Never send the full account number.
Year for dates printed without one, e.g. 2026.
Ending balance for LEDGERBAL, e.g. "$5,034.47". If unknown, the files say so (see result).
Opening balance if the file has none, e.g. 4123.55. With closing_balance it proves no row is missing.
Date order inside the QIF file: MDY (default, Quicken US) or DMY (Quicken UK, MoneyDance in Europe).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http bank-to-qbo https://bank-to-qbo.zovo.one/mcp
Use this when the user attaches a bank or credit card statement (text PDF, CSV or Excel export) and wants to convert the bank statement to a QBO file, or an OFX, QIF or QuickBooks CSV: "convert pdf to qbo", "bank statement to ofx", "csv to qif". Returns a QuickBooks Web Connect .qbo, OFX 1.0.2 and OFX 2 files, a QIF, a 3-column QuickBooks CSV and an Excel review sheet, with stable unique FITIDs, the statement period and the ending balance, and checks opening + transactions = closing. Does not read scans or photos (use generate_qbo_file with the rows you can read) and does not connect to banks or QuickBooks.
| Argument | Type | Description |
|---|---|---|
| file* | object | The statement to convert: a text PDF, or the CSV or Excel (.xlsx) export from online banking, e.g. chase-sept-2026.pdf. |
| bank_id | string | number | null | Optional BANKID for the OFX files: the bank's 9-digit ABA number printed on checks, e.g. 121000248. Default 000000000. |
| currency | string | number | null | ISO currency code, e.g. USD (default), CAD, GBP. |
| intu_bid | string | number | null | QuickBooks Web Connect bank id (INTU.BID) for the .qbo file. Default 3000. Use the id of your own bank if QuickBooks Desktop asks for a supported bank. |
| date_order | string | number | null | Order of numeric dates: MDY (default, US) or DMY. Detected from the file when a day is above 12. |
| flip_signs | boolean | string | null | Only for CSV/Excel card exports that list purchases as positive: true flips every amount. Default false. |
| account_type | string | number | null | checking (default), savings, money_market, credit_card or line_of_credit. auto reads it from a PDF statement. Example: credit_card. |
| account_last4 | string | number | null | Last 4 digits of the account (or any short label) used as the account id QuickBooks links to, e.g. 4821. Default 0000. Never send the full account number. |
| statement_year | number | string | null | Year for dates printed without one, e.g. 2026. |
| closing_balance | number | string | null | Ending balance for LEDGERBAL, e.g. "$5,034.47". If unknown, the files say so (see result). |
| opening_balance | number | string | null | Opening balance if the file has none, e.g. 4123.55. With closing_balance it proves no row is missing. |
| qif_date_format | string | number | null | Date order inside the QIF file: MDY (default, Quicken US) or DMY (Quicken UK, MoneyDance in Europe). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The statement to convert: a text PDF, or the CSV or Excel (.xlsx) export from online banking, e.g. chase-sept-2026.pdf."
},
"bank_id": {
"type": [
"string",
"number",
"null"
],
"description": "Optional BANKID for the OFX files: the bank's 9-digit ABA number printed on checks, e.g. 121000248. Default 000000000."
},
"currency": {
"type": [
"string",
"number",
"null"
],
"description": "ISO currency code, e.g. USD (default), CAD, GBP."
},
"intu_bid": {
"type": [
"string",
"number",
"null"
],
"description": "QuickBooks Web Connect bank id (INTU.BID) for the .qbo file. Default 3000. Use the id of your own bank if QuickBooks Desktop asks for a supported bank."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: MDY (default, US) or DMY. Detected from the file when a day is above 12."
},
"flip_signs": {
"type": [
"boolean",
"string",
"null"
],
"description": "Only for CSV/Excel card exports that list purchases as positive: true flips every amount. Default false."
},
"account_type": {
"type": [
"string",
"number",
"null"
],
"description": "checking (default), savings, money_market, credit_card or line_of_credit. auto reads it from a PDF statement. Example: credit_card."
},
"account_last4": {
"type": [
"string",
"number",
"null"
],
"description": "Last 4 digits of the account (or any short label) used as the account id QuickBooks links to, e.g. 4821. Default 0000. Never send the full account number."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Ending balance for LEDGERBAL, e.g. \"$5,034.47\". If unknown, the files say so (see result)."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 4123.55. With closing_balance it proves no row is missing."
},
"qif_date_format": {
"type": [
"string",
"number",
"null"
],
"description": "Date order inside the QIF file: MDY (default, Quicken US) or DMY (Quicken UK, MoneyDance in Europe)."
}
}
}Use this when the user wants to convert bank statement rows to a QBO, OFX or QIF file from rows they pasted, typed or showed in a statement photo or table: "convert csv to qbo", "bank statement to qbo converter". First convert what the user gave into transaction objects (date, description, signed amount or withdrawal/deposit, optional balance and check number); pass raw text in `text` only if you cannot. Returns QBO, OFX 1.0.2, OFX 2, QIF, QuickBooks CSV and an Excel review sheet with unique FITIDs and the ending balance. Do not use when a statement file is attached (use convert_statement_to_qbo); does not connect to banks or QuickBooks.
| Argument | Type | Description |
|---|---|---|
| text | any | Fallback only: pasted statement text or CSV when you cannot build the objects. |
| bank_id | string | number | null | Optional BANKID for the OFX files: the bank's 9-digit ABA number printed on checks, e.g. 121000248. Default 000000000. |
| currency | string | number | null | ISO currency code, e.g. USD (default), CAD, GBP. |
| intu_bid | string | number | null | QuickBooks Web Connect bank id (INTU.BID) for the .qbo file. Default 3000. Use the id of your own bank if QuickBooks Desktop asks for a supported bank. |
| date_order | string | number | null | Order of numeric dates: MDY (default, US) or DMY. Detected from the file when a day is above 12. |
| account_type |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
| string | number | null |
| checking (default), savings, money_market, credit_card or line_of_credit. auto reads it from a PDF statement. Example: credit_card. |
| transactions | any | Rows as objects in statement order, e.g. [{"date":"09/02/2026","description":"PAYROLL ACME INC","amount":2450},{"date":"09/03/2026","description":"GREENLEAF MARKET","amount":-82.17}]. Pasted CSV text is also accepted. |
| account_last4 | string | number | null | Last 4 digits of the account (or any short label) used as the account id QuickBooks links to, e.g. 4821. Default 0000. Never send the full account number. |
| statement_year | number | string | null | Year for dates printed without one, e.g. 2026. |
| closing_balance | number | string | null | Ending balance for LEDGERBAL, e.g. "$5,034.47". If unknown, the files say so (see result). |
| opening_balance | number | string | null | Opening balance if the file has none, e.g. 4123.55. With closing_balance it proves no row is missing. |
| qif_date_format | string | number | null | Date order inside the QIF file: MDY (default, Quicken US) or DMY (Quicken UK, MoneyDance in Europe). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"text": {
"anyOf": [
{
"type": "string",
"maxLength": 2000000
},
{
"type": "null"
}
],
"description": "Fallback only: pasted statement text or CSV when you cannot build the objects."
},
"bank_id": {
"type": [
"string",
"number",
"null"
],
"description": "Optional BANKID for the OFX files: the bank's 9-digit ABA number printed on checks, e.g. 121000248. Default 000000000."
},
"currency": {
"type": [
"string",
"number",
"null"
],
"description": "ISO currency code, e.g. USD (default), CAD, GBP."
},
"intu_bid": {
"type": [
"string",
"number",
"null"
],
"description": "QuickBooks Web Connect bank id (INTU.BID) for the .qbo file. Default 3000. Use the id of your own bank if QuickBooks Desktop asks for a supported bank."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: MDY (default, US) or DMY. Detected from the file when a day is above 12."
},
"account_type": {
"type": [
"string",
"number",
"null"
],
"description": "checking (default), savings, money_market, credit_card or line_of_credit. auto reads it from a PDF statement. Example: credit_card."
},
"transactions": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"date": {
"type": [
"string",
"number",
"null"
],
"description": "Posting date, e.g. 2026-09-02 or 09/02/2026."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Signed amount: money in positive, money out (and card charges) negative, e.g. -82.17. Or use withdrawal/deposit."
},
"balance": {
"type": [
"number",
"string",
"null"
],
"description": "Running balance after the row if printed, e.g. 4078.45."
},
"deposit": {
"type": [
"number",
"string",
"null"
],
"description": "Money in (credit, payment to a card) as a positive number, e.g. 2450."
},
"withdrawal": {
"type": [
"number",
"string",
"null"
],
"description": "Money out (debit, charge) as a positive number, e.g. 82.17."
},
"description": {
"type": [
"string",
"number",
"null"
],
"description": "Payee or description as printed, e.g. GREENLEAF MARKET #221."
},
"check_number": {
"type": [
"string",
"number",
"null"
],
"description": "Check number if any, e.g. 1043."
}
},
"additionalProperties": {}
},
{
"type": "array",
"items": {
"type": [
"string",
"number",
"null"
]
}
},
{
"type": "string"
}
]
},
"maxItems": 20001
},
{
"type": "string",
"maxLength": 2000000
}
]
},
{
"type": "null"
}
],
"description": "Rows as objects in statement order, e.g. [{\"date\":\"09/02/2026\",\"description\":\"PAYROLL ACME INC\",\"amount\":2450},{\"date\":\"09/03/2026\",\"description\":\"GREENLEAF MARKET\",\"amount\":-82.17}]. Pasted CSV text is also accepted."
},
"account_last4": {
"type": [
"string",
"number",
"null"
],
"description": "Last 4 digits of the account (or any short label) used as the account id QuickBooks links to, e.g. 4821. Default 0000. Never send the full account number."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Ending balance for LEDGERBAL, e.g. \"$5,034.47\". If unknown, the files say so (see result)."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 4123.55. With closing_balance it proves no row is missing."
},
"qif_date_format": {
"type": [
"string",
"number",
"null"
],
"description": "Date order inside the QIF file: MDY (default, Quicken US) or DMY (Quicken UK, MoneyDance in Europe)."
}
}
}