Bankstatemently

io.github.bankstatemently由 GitHub 帳號 bankstatemently 發布v2.1.0更新於 Oct 24, 2026

Convert PDF bank statements into structured transactions, accounts, and balances.

已驗證Streamable HTTP可網頁執行檔案與儲存金融資料與分析

概覽

AI 產生的概覽

託管式 MCP 伺服器,將 PDF 銀行對帳單轉為結構化交易、帳戶與餘額,並讓助理查詢與分析這些資料。

可以做什麼
從附件或公開連結轉換 PDF 對帳單,再以 JSON、CSV、XLSX、QBO 或 Xero 下載形式取得結果,列出或隱藏歷史對帳單,並對解析結果評分或做基準評測。對已處理的對帳單執行 AI 交易分類。跨已轉換對帳單查詢交易,並依幣別計算彙總、分組、前 N 排名、比較與時間序列。比對自有帳戶之間的轉帳,裁定模糊轉帳或未解決支出。查看剩餘額度與方案限制。建立、列出與更新依帳戶和日期範圍限定的具名記憶。
適用情境
適合需要把銀行對帳單 PDF 轉成結構化資料,並回答支出、分類、轉帳或趨勢問題的情境,省去手動整理試算表。也適合需要依帳戶與日期範圍檢視資料的記帳類工作流程。
執行需求
遠端 streamable HTTP 端點,無需本機安裝,公開儲存庫另提供自架 stdio 版本。認證使用 X-API-Key 標頭中的 API 金鑰(伺服器不接受 Authorization: Bearer);部分用戶端支援瀏覽器登入。呼叫工具需要 Bankstatemently 帳戶與 API 金鑰。
安裝前請注意
API 金鑰是有效憑證,應避免出現在用戶端日誌中,也不要在 MCP 指令內部解析它,因為 mcp-remote 會把解析後的標頭值寫入 stderr。轉換與首次分類會消耗額度(每頁 1 額度),呼叫可能產生費用。對帳單資料會傳送到 Bankstatemently 的伺服器。評分會計入網站平均值,隱藏操作只是不再顯示文件,並不會刪除已存資料。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Bankstatemently,將其新增到工作區。
  2. 連接 X-API-Key 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.bankstatemently%2Fbankstatemently-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "bankstatemently": {
      "type": "http",
      "url": "https://api.bankstatemently.com/mcp",
      "headers": {
        "X-API-Key": "<YOUR_API_KEY>"
      }
    }
  }
}

README

bankstatemently/plugins

[plugins MCP server]

Marketplace plugins for Bankstatemently — convert bank statements.

Install via Claude Code marketplace

bash
/plugin marketplace add bankstatemently/plugins/plugin install bankstatemently@bankstatemently

After installing, enable the plugin. The first tool call opens your browser to sign in; the plugin asks for no settings.

For a headless setup (CI, scripts), skip the plugin and add the server directly with an API key — see below. Get a key at bankstatemently.com/developer.

Plugins

  • bankstatemently — MCP server for converting bank statements. Convert PDFs, list statements, check credits, run benchmark evaluations.

Claude Code direct install (no plugin)

Add the hosted MCP server directly and sign in with your browser:

bash
claude mcp add --transport http bankstatemently https://api.bankstatemently.com/mcp

For a headless setup, pass an API key in the X-API-Key header instead (the server rejects Authorization: Bearer):

bash
claude mcp add --transport http bankstatemently https://api.bankstatemently.com/mcp \  --header "X-API-Key: <your-bsk_live_key>"

Codex

Codex has native OAuth support. This one command detects our server's discovery metadata and opens your browser to sign in — no key is ever stored:

bash
codex mcp add bankstatemently --url https://api.bankstatemently.com/mcp

For headless or CI setups where a browser sign-in isn't possible, use an API key via the mcp-remote bridge instead. Export the key in the shell that launches Codex, before it starts:

bash
export BANKSTATEMENTLY_API_KEY=bsk_live_...
codex mcp add bankstatemently -- npx -y mcp-remote@latest https://api.bankstatemently.com/mcp --header "X-API-Key: ${BANKSTATEMENTLY_API_KEY}"

Codex doesn't yet surface plugin-declared MCP servers into sessions, so the plugin install above (and its bundled skill) isn't available in Codex today — use the commands above instead.

Credential managers & sandboxed clients: never fetch a secret from Keychain, 1Password, or another credential manager inside the MCP server command itself — Codex runs that command sandboxed at tool discovery, so a credential-manager lookup dies silently and the server's tools never appear. Export the key in the shell that launches Codex instead. Also note that mcp-remote logs its resolved header values to stderr, so a wrapper-resolved key can end up in your client logs.

Run over stdio

For stdio-only clients (Claude Desktop's config file, Cursor, headless setups) or a directory scanner that launches the server locally, clone the public repo and run the self-contained mcp-stdio server directly — no Docker, no bridge process:

bash
git clone https://github.com/bankstatemently/plugins.gitcd plugins/mcp-stdionpm install --omit=devBANKSTATEMENTLY_API_KEY=bsk_live_... node dist/stdio.js

BANKSTATEMENTLY_API_KEY is optional at startup: initialize/tools/list answer with no network call and no key either way, so an uncredentialed directory probe still sees the full tool list. A tools/call with no key returns the same auth-required result the hosted server returns. Export the key in the shell or runtime environment that launches the process — never resolve it inside the MCP command (a credential-manager lookup inside a sandboxed client's command dies silently, same caveat as the Codex section above).

來源:README.md,提交 b8de8d2

工具

22

request_upload

Request Upload URL

Mint a single-use upload URL for pushing a conversation-attached PDF to Bankstatemently before converting it. Use this ONLY when you have no other way to reference the attached file (no pdf_file/pdf_url equivalent for this host) — e.g. a code-execution sandbox that can see the file on disk but has no URL for it. Playbook: (1) check your sandbox's uploads/attachments directory first — if the file isn't there yet, the mount can lag behind the conversation; ask the user to re-attach or wait a moment and check again before calling this tool. (2) Call request_upload to get upload_url and upload_id. (3) PUT the raw PDF bytes to upload_url with header Content-Type: application/pdf, e.g.: `curl -X PUT "<upload_url>" -H "Content-Type: application/pdf" --data-binary @<path-to-file>`. (4) Once the PUT succeeds, call convert_statement with upload_id set to the same value — never pdf/pdf_url/pdf_file for this flow. The URL and token are single-use and expire quickly; call request_upload again for a fresh one if the PUT fails partway through — never retry a failed PUT against the same URL. If the PUT fails with a network error or a "host not allowed"-style denial, the sandbox is likely blocking outbound requests to api.bankstatemently.com — tell the user to add api.bankstatemently.com to their host's code-execution allowed-domains setting (on claude.ai: Settings → Capabilities → Code execution) and retry. To convert several statements at once, pass count (1-100) instead of calling this tool once per file: the response returns "uploads", an array of that many { upload_id, upload_url } pairs — PUT each file to its own upload_url, then make ONE convert_statement call with upload_ids set to every upload_id. Free to use — no credits consumed (conversion itself still costs credits, same as any other convert_statement call).

輸入參數count

convert_statement

Convert Bank Statement

Convert a bank statement PDF into structured data or a spreadsheet. When the user attaches a PDF in the conversation, it arrives automatically as pdf_file — never encode it yourself. Otherwise, pass pdf_url for a public HTTPS link. If your host has no way to reference the attached file at all (no pdf_file/pdf_url equivalent), call request_upload first and pass its upload_id here instead. The base64 pdf parameter is a last resort only, for a caller with no other way to reference the file. To convert several statements in one call, pass upload_ids (the array from a single request_upload call made with count set) instead of pdf/pdf_url/pdf_file/upload_id — mutually exclusive with those four. This batch form only ADMITS each file (queues it, or reports an already-completed duplicate) and returns immediately with a compact per-file status list plus a summary — it never waits for conversion, so call get_statement per document_id once ready rather than expecting inline results here. Returns accounts, transactions, and metadata. output_format "json" (default) returns the data inline, renderable in chat. The other formats (csv, xlsx, qbo, xero) return a time-limited download link instead: present it as a normal link. Every response includes a "summary" field: use it as the single source of truth for what happened. If the conversation is not in English, translate it faithfully into the conversation language; never add details it doesn't contain. Never echo raw status values (e.g. "completed") or field names. Consumes credits (1 per page). Page limit depends on your plan.

輸入參數pdfpdf_urlpasswordpdf_fileupload_idupload_idsoutput_format

get_statement

Get Statement Data

Fetch the full converted data for a previously processed document. Use this after convert_statement returns a "processing" status, or to re-fetch results. output_format "json" (default) returns the data inline, renderable in chat. The other formats (csv, xlsx, qbo, xero) return a time-limited download link instead: present it as a normal link. data_mode selects which projection of the data you get: omit it for each output_format's existing default behavior. "normalized" is the cleaned, interpreted view; "original" includes each transaction's raw column values exactly as printed on the source PDF (originalData); "enhanced" is a reformatted view of the original columns (csv/xlsx only for now). Fetch data_mode: "original" when you plan to submit results to evaluate_benchmark — pass its originalData through verbatim; an absent originalData scores that benchmark's raw-fidelity dimension 0 for this document. Every response includes a "summary" field: use it as the single source of truth for what happened. If the conversation is not in English, translate it faithfully into the conversation language; never add details it doesn't contain. Never echo raw status values (e.g. "completed") or field names.

輸入參數limitoffsetdata_modedocument_id必填output_format

categorize_statement

Categorize Transactions

Run AI transaction categorization on a previously processed document, then return its category mappings. Returns cached categories with no charge if this document was already categorized. Consumes credits (pooled per page, same rate as the categorize toggle on the website) the first time — free on every re-fetch after. Every response includes a "summary" field: use it as the single source of truth for what happened.

輸入參數document_id必填

list_statements

List Statements

Browse your previously converted bank statements with pagination and optional status filter.

輸入參數limitoffsetstatus

dismiss_statement

Dismiss Statement

Hide a failed, rejected, or cancelled document from future list_statements results. Use this only when the user asks to clear a terminal failed/rejected/cancelled conversion from their history. This is not a delete: it marks the document dismissed and leaves stored data/artifacts untouched.

輸入參數document_id必填

adjudicate_transfers

Adjudicate Transfers

Decide whether ambiguous pairs from list_transfers are transfers. Pass "verdict" when the user has told you; leave it out to let the AI judge decide. Returns the updated list_transfers answer.

輸入參數pairsscopeverdictamountMin

adjudicate_outflows

Adjudicate Outflows

Decide where an "unresolved" debit from list_outflows went (the documents' claims conflict and nothing settles them). Pass "verdict" and "transactionIds" when the user has told you; leave "verdict" out to let the AI judge decide the named rows, or every unresolved row. Returns the updated list_outflows answer.

輸入參數scopeverdictdateRangetransactionIds

get_credits

Get Credit Balance

Your remaining Bankstatemently credits — the processing quota, NOT credit/debit transactions. Use for: how many credits do I have, remaining pages, plan limits, quota, how many pages can I upload. 1 credit = 1 page of bank statement processing. Also reports your plan's operational limits (max pages per upload, max upload size, daily spend cap) so you can size a multi-file batch correctly before starting it.

無需輸入參數。

list_memories

List Memories

List your memories, default memory first. The default memory covers the whole workspace. Named memories include name, situation and scope. Free to use — no credits consumed.

無需輸入參數。

create_memory

Create Memory

Create a named memory: a scoped lens over your accounts and dates with a user-authored name, optional situation ("bookkeeping", "divorce" or "estate"), and ChatScope. Free to use — no credits consumed.

輸入參數name必填scope必填situation必填

update_memory

Update Memory

Rename or rescope an existing named memory, or update its situation. The default memory is immutable. Free to use — no credits consumed.

輸入參數namescopememoryId必填situation

rate_statement

Rate Statement Conversion

Report how well a previously converted bank statement was parsed: submit a 1-5 rating, optionally with structured feedback at any rating. Your rating counts toward the average ratings shown on bankstatemently.com. Calling this again for the same document updates your existing rating without clearing feedback already submitted for it. Returns the stored rating state in the response — there is no separate tool to read your own rating back. Every response includes a "summary" field: use it as the single source of truth for what happened.

輸入參數rating必填feedbackdocument_id必填feedback_categories

evaluate_benchmark

Evaluate Benchmark

Score parsed bank statement transactions against the Bankstatemently benchmark ground truth. Accepts a statement_id (e.g. "bsb-001") or content_hash, plus your parsed transactions. Returns extraction accuracy, integrity score, and an overall score. Only statements marked published: true in the catalog can be evaluated — held-out statements return an error. transactions[].originalData is optional but strongly recommended: fetch it via get_statement with data_mode: "original" and pass it through verbatim — an absent originalData scores that transaction's raw-fidelity (parsed) dimension 0; never fabricate a value. Free to use — no credits consumed. Read the benchmark://catalog resource first to see available statements and their published status.

輸入參數accountscontent_hashstatement_idtransactions必填

list_transactions

List Transactions

A transaction is a single line as printed on one account's statement — one side of any movement. Return a filtered list of transactions across your converted statements, capped at 50 rows. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. Every response names the scope it actually evaluated (document count + covered date range) and each returned row carries its source document's content_hash so you can cite it. For "how many credits do I have" / processing quota / remaining pages, use get_credits instead — that is not a transaction.

輸入參數limitorderscopefiltersort_by

aggregate

Aggregate Transactions

Compute a single metric (sum/average/count/max/min) over a filtered set of transactions across your converted statements. Results are per-currency — never sum across currencies yourself. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. For "how many credits do I have" / processing quota / remaining pages, use get_credits instead — that is not a transaction.

輸入參數scopefiltermetric必填

group_by

Group Transactions

Group transactions by a dimension (month/category/counterparty/account/currency) and apply a metric to each group. Results are per-currency. The "counterparty" dimension keys on the printed counterparty, else a printed account mask (••1234), else the description's name tokens, so a rail word or reference number never splits one payee; a line with no key groups under "unknown". Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

輸入參數scopefiltermetric必填dimension必填

top_n

Top Transaction Groups

Return the top N groups ranked by metric (descending), per-currency for monetary metrics. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

輸入參數n必填scopefiltermetric必填dimension必填

compare

Compare Transaction Groups

Side-by-side metric comparison for two filtered groups of transactions (e.g. one category vs another, one month vs another). Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

輸入參數scopemetric必填filterA必填filterB必填

time_series

Transaction Time Series

Compute a time series by grouping transactions into week or month buckets and applying a metric — useful for trends. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range.

輸入參數scopebucket必填filtermetric必填

list_transfers

Match Transfers Between Accounts

Match transfers between your own accounts. A transfer is TWO transactions — a debit leaving one of your accounts and a credit arriving in another — matched as two sides of the same movement (amount and date aligned); account-level successions (an account closing into a successor) are matched too. A payment to an outside party is not a transfer here: only movements with both sides visible in your statements are matched. THE way to answer any "was money moved between my accounts" / "did I transfer X" question — never try to answer a money-moved-between-accounts question with list_transactions + arithmetic; always call this tool instead. Ties come back as "ambiguous" until decided; call adjudicate_transfers to decide them. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range. Every response reports the match window (in days) it used, even when no transfers are found — a lack of matches is never silent about how hard it looked. To find large movements with NO matching counterpart in your other accounts — e.g. "trace transfers over $10,000; which ones leave without a known destination?" — pass "amountMin": reconciled pairs and successions are filtered to that floor, and the response gains an "unmatched" bucket of large movements (debits leaving, or unexplained credits arriving) with no matching pair, candidate, or succession. Omit amountMin for the ordinary reconciled-pairs answer.

輸入參數scopeamountMin

list_outflows

List Money That Left Your Accounts

Every debit that left your accounts — in no confirmed transfer between your own accounts, and not a fee — each in ONE destination whose kind is also its next step: "own-account" (a printed account mask that names one of your accounts and no matched credit was found: ask for that account's statement), "account" (a printed account mask for an account outside your statements: request that account's statements; an in-kind move such as securities, crypto or escrow starts as a wire to that account and becomes visible only once the receiving statement is uploaded), "cash" (cash out: where it went cannot be followed, so the cumulative amount is the finding), "name" (a named party: review whether it was household spending) and "unknown" (nowhere the line says; kept visible, one entry per line, never merged). A destination carries the cumulative amount sent, per currency, never a balance. "mayBeOwnAccount" lists debits in an open candidate pair ("may be a move between your own accounts") apart, in no total. "unresolved" lists debits whose documents conflict about where they went (a transfer term and a payment term, no category to settle it) apart, in no total: the documents do not say where they went, so say so and ask the person to confirm. THE way to answer "did money disappear from my accounts, and where do I look next" — never answer it by summing list_transactions rows. Pass "dateRange" ({ from, to }, inclusive, YYYY-MM-DD) to report only debits in that range, for example from a separation date: transfers are matched over the whole scope first, so a transfer whose credit lies outside the range is still a transfer, never an outflow. Scope defaults to all your completed statements; pass "scope" to narrow to specific accounts/products and/or a date range (a scope date range also narrows what is matched — prefer "dateRange").

輸入參數scopedateRange

版本歷史

5
  1. v2.1.0最新Oct 6, 2026
  2. v2.0.0Oct 2, 2026
  3. v1.5.0Sep 30, 2026
  4. v1.4.0Sep 24, 2026
  5. v0.14.0Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分