Skip to main content
Glama

Bankstatemently

Convert Bank Statement

convert_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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pdfNoBase64-encoded PDF content — last resort only; prefer pdf_file for an attachment or pdf_url for a link
pdf_urlNoHTTPS URL to fetch the PDF from
passwordNoPassword for encrypted PDFs
pdf_fileNoAn attached PDF (populated automatically by ChatGPT — do not construct this yourself).
upload_idNoAn upload_id from request_upload, after PUTting the file to its upload_url. Use this only when your host has no other way to reference the attached file (no pdf_file/pdf_url equivalent).
upload_idsNoBatch of upload_ids from a single request_upload(count) call, each already PUT to its own upload_url — converts many statements in one call. Mutually exclusive with pdf, pdf_url, pdf_file, and upload_id. Admission only: the response reports per-file status immediately, never waiting for conversion — fetch results per document_id via get_statement.
output_formatNoOutput formatjson

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hintNo
errorNo
gatingNo
statusYes
columnsNo
messageNo
resultsNo
summaryNo
dataModeNo
documentNo
warningsNo
exportUrlNo
documentIdNo
extractionNo
paginationNo
processedAtNo
transactionsNo
confidenceScoreNo
processingTimeMsNo
transactionCountNo

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed13 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / properties / output_format / description
      Added value: +"Output format"
    • addedInput schema / properties / password / description
      Added value: +"Password for encrypted PDFs"
    • addedInput schema / properties / pdf / description
      Added value: +"Base64-encoded PDF content — last resort only; prefer pdf_file for an attachment or pdf_url for a link"
    • addedInput schema / properties / pdf_file / description
      Added value: +"An attached PDF (populated automatically by ChatGPT — do not construct this yourself)."
    • addedInput schema / properties / pdf_file / properties / download_url / description
      Added value: +"Signed URL ChatGPT provides to fetch the attached PDF's bytes."
    • addedInput schema / properties / pdf_file / properties / file_id / description
      Added value: +"ChatGPT's identifier for the attached file."
    • addedInput schema / properties / pdf_file / properties / file_name / description
      Added value: +"Original filename of the attached file, when ChatGPT provides one."
    • addedInput schema / properties / pdf_file / properties / mime_type / description
      Added value: +"MIME type of the attached file, when ChatGPT provides one."
    • addedInput schema / properties / pdf_url / description
      Added value: +"HTTPS URL to fetch the PDF from"
    • addedInput schema / properties / upload_id / description
      Added value: +"An upload_id from request_upload, after PUTting the file to its upload_url. Use this only when your host has no other way to reference the attached file (no pdf_file/pdf_url equivalent)."
    • addedInput schema / properties / upload_ids / description
      Added value: +"Batch of upload_ids from a single request_upload(count) call, each already PUT to its own upload_url — converts many statements in one call. Mutually exclusive with pdf, pdf_url, pdf_file, and upload_id. Admission only: the response reports per-file status immediately, never waiting for conversion — fetch results per document_id via get_statement."
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. Changed11 schema fields changed
    • removedInput schema / properties / output_format / description
      Removed value: -"Output format"
    • removedInput schema / properties / password / description
      Removed value: -"Password for encrypted PDFs"
    • removedInput schema / properties / pdf / description
      Removed value: -"Base64-encoded PDF content — last resort only; prefer pdf_file for an attachment or pdf_url for a link"
    • removedInput schema / properties / pdf_file / description
      Removed value: -"An attached PDF (populated automatically by ChatGPT — do not construct this yourself)."
    • removedInput schema / properties / pdf_file / properties / download_url / description
      Removed value: -"Signed URL ChatGPT provides to fetch the attached PDF's bytes."
    • removedInput schema / properties / pdf_file / properties / file_id / description
      Removed value: -"ChatGPT's identifier for the attached file."
    • removedInput schema / properties / pdf_file / properties / file_name / description
      Removed value: -"Original filename of the attached file, when ChatGPT provides one."
    • removedInput schema / properties / pdf_file / properties / mime_type / description
      Removed value: -"MIME type of the attached file, when ChatGPT provides one."
    • removedInput schema / properties / pdf_url / description
      Removed value: -"HTTPS URL to fetch the PDF from"
    • removedInput schema / properties / upload_id / description
      Removed value: -"An upload_id from request_upload, after PUTting the file to its upload_url. Use this only when your host has no other way to reference the attached file (no pdf_file/pdf_url equivalent)."
    • removedInput schema / properties / upload_ids / description
      Removed value: -"Batch of upload_ids from a single request_upload(count) call, each already PUT to its own upload_url — converts many statements in one call. Mutually exclusive with pdf, pdf_url, pdf_file, and upload_id. Admission only: the response reports per-file status immediately, never waiting for conversion — fetch results per document_id via get_statement."
  3. Changed2 schema fields changed
    • addedInput schema / properties / upload_ids
      Added value: +{
      +  "description": "Batch of upload_ids from a single request_upload(count) call, each already PUT to its own upload_url — converts many statements in one call. Mutually exclusive with pdf, pdf_url, pdf_file, and upload_id. Admission only: the response reports per-file status immediately, never waiting for conversion — fetch results per document_id via get_statement.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 100,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedOutput schema / properties / results
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "content_hash": {
      +        "type": "string"
      +      },
      +      "duplicate": {
      +        "type": "boolean"
      +      },
      +      "error_code": {
      +        "type": "string"
      +      },
      +      "status": {
      +        "type": "string"
      +      },
      +      "upload_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "upload_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  4. First observed

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses key behaviors: batch mode only admits/queues files and returns immediately rather than waiting, non-JSON outputs return time-limited download links, every response includes a summary field to use as the source of truth, credits are consumed per page, and the description instructs faithful translation of the summary. These are important non-obvious behaviors that an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence serves a purpose. It front-loads the core conversion purpose and then covers attached-file handling, batch behavior, output formats, summary guidance, and credit consumption without redundancy. The density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema, output schema, and sibling context, the description covers everything an agent needs to call this tool correctly: file source selection, batch vs single conversion, result retrieval via get_statement, output format behavior, summary handling, and credit cost. No critical operational gap is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema covers 100% of parameters, the description adds meaning beyond the schema: pdf_file is populated automatically and should never be constructed manually; base64 is a last resort; upload_ids are mutually exclusive with all other file-reference parameters; and output_format json returns inline data while other formats return download links. This substantially clarifies parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Convert a bank statement PDF into structured data or a spreadsheet.' This immediately distinguishes the tool from sibling tools like list_statements, get_statement, and categorize_statement, and it clearly identifies the conversion behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: use pdf_file for attachments, pdf_url for public links, upload_id when no attachment reference exists, base64 only as a last resort, and upload_ids for batch conversion while pointing to get_statement for fetching results. It also states which parameters are mutually exclusive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4/5.0
Disambiguation4/5

Core tools are cleanly separated by resource: statements, transactions, transfers, credits, and benchmark all have dedicated entry points. The five analytics tools (aggregate, group_by, compare, time_series, top_n) share metric/filter language, but their distinct output shapes and careful descriptions prevent major confusion, with only group_by vs. time_series/top_n occasionally overlapping.

Naming Consistency4/5

Most tools follow a clear snake_case verb_noun pattern such as convert_statement, list_transactions, rate_statement, and dismiss_statement. The analytics tools (aggregate, compare, group_by, time_series, top_n) break that pattern, but they are still recognizable, consistently styled, and form a meaningful cluster.

Tool Count4/5

At 16 tools, this is slightly above the typical 3-15 well-scoped range, but the server covers a broad workflow: upload, conversion, retrieval, categorization, analytics, transfer matching, rating, credits, and benchmarking. Each tool maps to a distinct capability, so the count feels justified rather than bloated.

Completeness4/5

The tool surface covers the full statement lifecycle from upload and conversion through retrieval, categorization, analysis, rating, and dismissal, plus useful side capabilities like credits and benchmark evaluation. Minor gaps exist—no permanent deletion and no way to manually edit category mappings—but dismiss_statement and categorize_statement provide adequate workarounds.