Bank statement PDFs to checked transactions, plus a free offline check for transaction tables.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <your DocFig API key from https://docfig.com/api>. Not needed for check_transactions.
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.
Check a bank or credit card statement's transactions table for errors. Free and offline: no API key, nothing is uploaded. Walks the running balance row by row and reports rows where the balance does not follow, swapped debit and credit columns, sign errors, duplicated or missing rows, dates out of order, and totals that miss the opening or closing balance, each with a likely fix. Give the table as csv_text (CSV or TSV with a header row) or as rows (first row is the header). Same result as `docfig check --json`.
The table as rows of cells, first row is the header, e.g. [["Date","Description","Amount","Balance"], ...]. Cells are text; numbers and null are accepted too.
The table as CSV or TSV text, header row first.
Optional name shown in the report.
CSV delimiter (default: detected).
How to read dates like 01/02/2026 (default: detected).
card: the balance is the amount owed.
Closing balance, to check the totals.
Opening balance, to check the totals.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http docfig https://mcp.docfig.com/mcp
Headers
Authorization (optional, not in the config above): Bearer <your DocFig API key from https://docfig.com/api>. Not needed for check_transactions.Check a bank or credit card statement's transactions table for errors. Free and offline: no API key, nothing is uploaded. Walks the running balance row by row and reports rows where the balance does not follow, swapped debit and credit columns, sign errors, duplicated or missing rows, dates out of order, and totals that miss the opening or closing balance, each with a likely fix. Give the table as csv_text (CSV or TSV with a header row) or as rows (first row is the header). Same result as `docfig check --json`.
| Argument | Type | Description |
|---|---|---|
| rows | array | The table as rows of cells, first row is the header, e.g. [["Date","Description","Amount","Balance"], ...]. Cells are text; numbers and null are accepted too. |
| csv_text | string | The table as CSV or TSV text, header row first. |
| filename | string | Optional name shown in the report. |
| delimiter | string | CSV delimiter (default: detected). |
| date_format | string | How to read dates like 01/02/2026 (default: detected). |
| statement_type | string | card: the balance is the amount owed. |
| closing_balance | string | Closing balance, to check the totals. |
| opening_balance | string | Opening balance, to check the totals. |
{
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "The table as rows of cells, first row is the header, e.g. [[\"Date\",\"Description\",\"Amount\",\"Balance\"], ...]. Cells are text; numbers and null are accepted too."
},
"csv_text": {
"type": "string",
"description": "The table as CSV or TSV text, header row first."
},
"filename": {
"type": "string",
"description": "Optional name shown in the report."
},
"delimiter": {
"type": "string",
"description": "CSV delimiter (default: detected)."
},
"date_format": {
"enum": [
"DMY",
"MDY"
],
"type": "string",
"description": "How to read dates like 01/02/2026 (default: detected)."
},
"statement_type": {
"enum": [
"bank",
"card"
],
"type": "string",
"default": "bank",
"description": "card: the balance is the amount owed."
},
"closing_balance": {
"type": "string",
"description": "Closing balance, to check the totals."
},
"opening_balance": {
"type": "string",
"description": "Opening balance, to check the totals."
}
}
}Convert several statements (or reuse statement_ids from the last hour) and combine them into one set of accounts: finds missing months (gaps), overlapping periods, duplicated transactions (kept once) and balances that do not carry over. Returns the accounts, problems, counts and links to one combined Excel or CSV file (valid one hour). Uses the user's DocFig API key.
| Argument | Type | Description |
|---|---|---|
| files | array | Statements to convert and combine, each with file_url or file_base64. |
| wait_seconds | integer | How long to wait for all conversions. Default 90. |
| statement_ids | array | statement_id values of statements converted in the last hour (from convert_statement or an earlier combine_statements call). |
{
"type": "object",
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"file_url": {
"type": "string",
"description": "Direct https download link to the statement (PDF, JPG, PNG or HEIC, up to 20 MB). Must be publicly reachable."
},
"filename": {
"type": "string",
"description": "Optional file name, e.g. march.pdf."
},
"password": {
"type": "string",
"description": "Password for a locked PDF. Used once in memory, never stored or logged."
},
"file_base64": {
"type": "string",
"description": "The file's bytes, base64-encoded (up to 20 MB decoded)."
}
}
},
"maxItems": 12,
"description": "Statements to convert and combine, each with file_url or file_base64."
},
"wait_seconds": {
"type": "integer",
"default": 90,
"maximum": 600,
"minimum": 0,
"description": "How long to wait for all conversions. Default 90."
},
"statement_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "statement_id values of statements converted in the last hour (from convert_statement or an earlier combine_statements call)."
}
}
}Convert a bank or credit card statement (PDF, scanned PDF, or a JPG, PNG or HEIC photo) into transactions, with every row checked against the balances. Give file_url or file_base64. Returns the bank, period, totals, check status, flagged rows, the first transactions and Excel and CSV download links that work for one hour. Uses the user's DocFig API key and their monthly pages (free key: 100 pages a month at https://docfig.com/api). Account numbers are masked; nothing is stored, results are deleted after one hour.
| Argument | Type | Description |
|---|---|---|
| file_url | string | Direct https download link to the statement (PDF, JPG, PNG or HEIC, up to 20 MB). Must be publicly reachable. |
| filename | string | Optional file name, e.g. march.pdf. |
| password | string | Password for a locked PDF. Used once in memory, never stored or logged. |
| file_base64 | string | The file's bytes, base64-encoded (up to 20 MB decoded). |
| statement_id | string | Instead of a file: the statement_id of an earlier call that was still converting, to fetch its result. |
| wait_seconds | integer | How long to wait for the result before returning the statement_id to check again. Default 45. |
| max_transactions | integer | How many transactions to include (the rest are in the downloads). Default 25. |
Pages used and left this month for the DocFig API key, and when they reset.
No arguments.
{
"type": "object",
"properties": {}
}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 1, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
{
"type": "object",
"properties": {
"file_url": {
"type": "string",
"description": "Direct https download link to the statement (PDF, JPG, PNG or HEIC, up to 20 MB). Must be publicly reachable."
},
"filename": {
"type": "string",
"description": "Optional file name, e.g. march.pdf."
},
"password": {
"type": "string",
"description": "Password for a locked PDF. Used once in memory, never stored or logged."
},
"file_base64": {
"type": "string",
"description": "The file's bytes, base64-encoded (up to 20 MB decoded)."
},
"statement_id": {
"type": "string",
"description": "Instead of a file: the statement_id of an earlier call that was still converting, to fetch its result."
},
"wait_seconds": {
"type": "integer",
"default": 45,
"maximum": 600,
"minimum": 0,
"description": "How long to wait for the result before returning the statement_id to check again. Default 45."
},
"max_transactions": {
"type": "integer",
"default": 25,
"maximum": 500,
"minimum": 0,
"description": "How many transactions to include (the rest are in the downloads). Default 25."
}
}
}