Convert a bank statement to Tally XML that you can import into TallyPrime or Tally ERP 9.
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 statement (text PDF, CSV or Excel from net banking) and wants it as Tally XML: "bank statement to tally xml", "import bank statement in tally prime", "excel to tally". Builds Payment, Receipt and Contra vouchers against the bank ledger, maps narrations to ledgers with keyword rules (unmatched rows go to a suspense ledger), checks each voucher balances and that opening + rows = closing, and returns the vouchers XML, a ledgers XML and an Excel review sheet. Does not read scans or photos (use generate_tally_vouchers with the rows you can read), does not post into Tally, and is not for GST returns or sales invoices.
The bank statement to convert: a text PDF, or the CSV or Excel (.xlsx) download from net banking, e.g. hdfc-april-2026.pdf.
Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally.
Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12.
Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true.
Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account.
Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash.
Narration keyword to ledger rules, first match wins, e.g. [{"match":"SALARY","ledger":"Salary Payable"},{"match":"GST","ledger":"GST Payable"}] or text "SALARY=Salary Payable; RENT=Rent". Rows that match no rule go to the suspense ledger.
Year for dates printed without one, e.g. 2026, or a financial year like "FY 2026-27" (April to December 2026, January to March 2027).
Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing.
Opening balance if the file has none, e.g. 125000.50 or "1,25,000.50 Cr". Used to check the total.
Ledger for rows that match no rule, e.g. Suspense. Default: Suspense.
Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c.
Only if you renamed voucher types in Tally, e.g. {"payment":"Bank Payment","receipt":"Bank Receipt"}. Defaults: Payment, Receipt, Contra.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http tally-import https://tally-import.zovo.one/mcp
Use this when the user attaches a bank statement (text PDF, CSV or Excel from net banking) and wants it as Tally XML: "bank statement to tally xml", "import bank statement in tally prime", "excel to tally". Builds Payment, Receipt and Contra vouchers against the bank ledger, maps narrations to ledgers with keyword rules (unmatched rows go to a suspense ledger), checks each voucher balances and that opening + rows = closing, and returns the vouchers XML, a ledgers XML and an Excel review sheet. Does not read scans or photos (use generate_tally_vouchers with the rows you can read), does not post into Tally, and is not for GST returns or sales invoices.
| Argument | Type | Description |
|---|---|---|
| file* | object | The bank statement to convert: a text PDF, or the CSV or Excel (.xlsx) download from net banking, e.g. hdfc-april-2026.pdf. |
| company | string | number | null | Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally. |
| date_order | string | number | null | Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12. |
| auto_contra | boolean | string | null | Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true. |
| bank_ledger | string | number | null | Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account. |
| cash_ledger | string | number | null | Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash. |
| ledger_rules | any | Narration keyword to ledger rules, first match wins, e.g. [{"match":"SALARY","ledger":"Salary Payable"},{"match":"GST","ledger":"GST Payable"}] or text "SALARY=Salary Payable; RENT=Rent". Rows that match no rule go to the suspense ledger. |
| statement_year | number | string | null | Year for dates printed without one, e.g. 2026, or a financial year like "FY 2026-27" (April to December 2026, January to March 2027). |
| closing_balance | number | string | null | Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing. |
| opening_balance | number | string | null | Opening balance if the file has none, e.g. 125000.50 or "1,25,000.50 Cr". Used to check the total. |
| suspense_ledger | string | number | null | Ledger for rows that match no rule, e.g. Suspense. Default: Suspense. |
| bank_ledger_group | string | number | null | Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c. |
| voucher_type_names | any | Only if you renamed voucher types in Tally, e.g. {"payment":"Bank Payment","receipt":"Bank Receipt"}. Defaults: Payment, Receipt, Contra. |
{
"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 bank statement to convert: a text PDF, or the CSV or Excel (.xlsx) download from net banking, e.g. hdfc-april-2026.pdf."
},
"company": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12."
},
"auto_contra": {
"type": [
"boolean",
"string",
"null"
],
"description": "Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true."
},
"bank_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account."
},
"cash_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash."
},
"ledger_rules": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"side": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: out (withdrawals only), in (deposits only) or both (default)."
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Optional Tally group for the ledgers file, e.g. Indirect Expenses, Sundry Creditors, Bank Accounts."
},
"match": {
"type": [
"string",
"number",
"null"
],
"description": "Text to look for in the narration, case-insensitive, whole words, e.g. SALARY or AMAZON (AMAZ* matches a word start)."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Tally ledger to post matching rows to, e.g. Salary Payable."
},
"voucher_type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: payment, receipt or contra. Use contra for transfers to your own other bank or cash account."
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 200
},
{
"type": "string",
"maxLength": 8000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
]
},
{
"type": "null"
}
],
"description": "Narration keyword to ledger rules, first match wins, e.g. [{\"match\":\"SALARY\",\"ledger\":\"Salary Payable\"},{\"match\":\"GST\",\"ledger\":\"GST Payable\"}] or text \"SALARY=Salary Payable; RENT=Rent\". Rows that match no rule go to the suspense ledger."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026, or a financial year like \"FY 2026-27\" (April to December 2026, January to March 2027)."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 125000.50 or \"1,25,000.50 Cr\". Used to check the total."
},
"suspense_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Ledger for rows that match no rule, e.g. Suspense. Default: Suspense."
},
"bank_ledger_group": {
"type": [
"string",
"number",
"null"
],
"description": "Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c."
},
"voucher_type_names": {
"anyOf": [
{
"type": "object",
"properties": {
"contra": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"payment": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"receipt": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Only if you renamed voucher types in Tally, e.g. {\"payment\":\"Bank Payment\",\"receipt\":\"Bank Receipt\"}. Defaults: Payment, Receipt, Contra."
}
}
}Use this when the user wants bank statement to Tally XML from rows they pasted, typed or showed in a statement photo or table: "bank statement to tally entry", "tally xml format for bank statement". First convert what the user gave into transaction objects (date, narration, withdrawal or deposit, balance, optional ledger); pass raw pasted text in `text` only if you cannot. Returns Payment, Receipt and Contra vouchers against the bank ledger, keyword ledger rules with a suspense fallback, a balance check to the paisa, the vouchers XML, a ledgers XML and an Excel review sheet. Do not use when a statement file is attached (use convert_statement_to_tally); does not post into Tally or file GST.
| Argument | Type | Description |
|---|---|---|
| text | any | Fallback only: pasted statement text or CSV when you cannot build the objects, e.g. "02/04/2026 NEFT ACME 25,000.00 Cr 1,45,000.00". |
| company | string | number | null | Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally. |
| date_order | string | number | null | Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12. |
| auto_contra | boolean | string | null | Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true. |
| bank_ledger | string | number | null | Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account. |
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.
| cash_ledger | string | number | null | Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash. |
| ledger_rules | any | Narration keyword to ledger rules, first match wins, e.g. [{"match":"SALARY","ledger":"Salary Payable"},{"match":"GST","ledger":"GST Payable"}] or text "SALARY=Salary Payable; RENT=Rent". Rows that match no rule go to the suspense ledger. |
| transactions | any | The bank rows as objects in statement order, e.g. [{"date":"02/04/2026","narration":"NEFT-ACME TRADERS","deposit":"25,000.00"},{"date":"03/04/2026","narration":"ATM WDL MG ROAD","withdrawal":5000}]. Pasted statement text is also accepted. |
| statement_year | number | string | null | Year for dates printed without one, e.g. 2026, or a financial year like "FY 2026-27" (April to December 2026, January to March 2027). |
| closing_balance | number | string | null | Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing. |
| opening_balance | number | string | null | Opening balance if the file has none, e.g. 125000.50 or "1,25,000.50 Cr". Used to check the total. |
| suspense_ledger | string | number | null | Ledger for rows that match no rule, e.g. Suspense. Default: Suspense. |
| bank_ledger_group | string | number | null | Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c. |
| voucher_type_names | any | Only if you renamed voucher types in Tally, e.g. {"payment":"Bank Payment","receipt":"Bank Receipt"}. Defaults: Payment, Receipt, Contra. |
{
"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, e.g. \"02/04/2026 NEFT ACME 25,000.00 Cr 1,45,000.00\"."
},
"company": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally company name, e.g. Sharma Traders 2026-27. Leave empty to import into the company open in Tally."
},
"date_order": {
"type": [
"string",
"number",
"null"
],
"description": "Order of numeric dates: DMY (default, 02/04/2026 = 2 April) or MDY. Detected from the file when a day is above 12."
},
"auto_contra": {
"type": [
"boolean",
"string",
"null"
],
"description": "Book ATM withdrawals and cash deposits as Contra vouchers against the cash ledger. Default true."
},
"bank_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Your bank ledger name exactly as in Tally, e.g. HDFC Bank A/c. Default: Bank Account."
},
"cash_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Cash ledger for ATM withdrawals and cash deposits (booked as Contra), e.g. Cash. Default: Cash."
},
"ledger_rules": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"side": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: out (withdrawals only), in (deposits only) or both (default)."
},
"group": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Optional Tally group for the ledgers file, e.g. Indirect Expenses, Sundry Creditors, Bank Accounts."
},
"match": {
"type": [
"string",
"number",
"null"
],
"description": "Text to look for in the narration, case-insensitive, whole words, e.g. SALARY or AMAZON (AMAZ* matches a word start)."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Tally ledger to post matching rows to, e.g. Salary Payable."
},
"voucher_type": {
"anyOf": [
{
"type": "string",
"maxLength": 20
},
{
"type": "null"
}
],
"description": "Optional: payment, receipt or contra. Use contra for transfers to your own other bank or cash account."
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 200
},
{
"type": "string",
"maxLength": 8000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
]
},
{
"type": "null"
}
],
"description": "Narration keyword to ledger rules, first match wins, e.g. [{\"match\":\"SALARY\",\"ledger\":\"Salary Payable\"},{\"match\":\"GST\",\"ledger\":\"GST Payable\"}] or text \"SALARY=Salary Payable; RENT=Rent\". Rows that match no rule go to the suspense ledger."
},
"transactions": {
"anyOf": [
{
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"ref": {
"type": [
"string",
"number",
"null"
],
"description": "Cheque or reference number if shown, e.g. 000123 or UTR N1234."
},
"date": {
"type": [
"string",
"number",
"null"
],
"description": "Transaction date, e.g. 2026-04-02 or 02/04/2026 or 02-Apr-2026."
},
"amount": {
"type": [
"number",
"string",
"null"
],
"description": "Alternative to withdrawal/deposit: one signed amount (money in positive, money out negative), or an amount with Dr/Cr, e.g. \"4,500.00 Dr\"."
},
"ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Optional Tally ledger for this row if the user said it, e.g. Office Rent. Overrides the rules."
},
"balance": {
"type": [
"number",
"string",
"null"
],
"description": "Running balance after the row if shown, e.g. \"1,20,500.00 Cr\"."
},
"deposit": {
"type": [
"number",
"string",
"null"
],
"description": "Deposit (credit) amount, money in, e.g. 25000. Leave empty for a withdrawal."
},
"narration": {
"type": [
"string",
"number",
"null"
],
"description": "Narration or description as printed, e.g. NEFT-ACME TRADERS-INV 114."
},
"withdrawal": {
"type": [
"number",
"string",
"null"
],
"description": "Withdrawal (debit) amount, money out, e.g. 4500 or \"1,25,000.00\". Leave empty for a deposit."
},
"voucher_type": {
"type": [
"string",
"number",
"null"
],
"description": "Optional: payment, receipt or contra for this row."
}
},
"additionalProperties": {}
},
{
"type": "array",
"items": {
"type": [
"string",
"number",
"null"
]
}
},
{
"type": "string"
}
]
},
"maxItems": 20001
},
{
"type": "string",
"maxLength": 2000000
}
]
},
{
"type": "null"
}
],
"description": "The bank rows as objects in statement order, e.g. [{\"date\":\"02/04/2026\",\"narration\":\"NEFT-ACME TRADERS\",\"deposit\":\"25,000.00\"},{\"date\":\"03/04/2026\",\"narration\":\"ATM WDL MG ROAD\",\"withdrawal\":5000}]. Pasted statement text is also accepted."
},
"statement_year": {
"type": [
"number",
"string",
"null"
],
"description": "Year for dates printed without one, e.g. 2026, or a financial year like \"FY 2026-27\" (April to December 2026, January to March 2027)."
},
"closing_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Closing balance if the file has none, e.g. 98450.00. With the opening balance it proves no row is missing."
},
"opening_balance": {
"type": [
"number",
"string",
"null"
],
"description": "Opening balance if the file has none, e.g. 125000.50 or \"1,25,000.50 Cr\". Used to check the total."
},
"suspense_ledger": {
"type": [
"string",
"number",
"null"
],
"description": "Ledger for rows that match no rule, e.g. Suspense. Default: Suspense."
},
"bank_ledger_group": {
"type": [
"string",
"number",
"null"
],
"description": "Group of the bank ledger in the ledgers file: Bank Accounts (default) or Bank OD A/c."
},
"voucher_type_names": {
"anyOf": [
{
"type": "object",
"properties": {
"contra": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"payment": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
},
"receipt": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
]
}
}
},
{
"type": "null"
}
],
"description": "Only if you renamed voucher types in Tally, e.g. {\"payment\":\"Bank Payment\",\"receipt\":\"Bank Receipt\"}. Defaults: Payment, Receipt, Contra."
}
}
}