MCP server: One MCP server.

Taxformatter

@sean-bravoRun by its publisher: served from their own domain, namespace checked by the registry.MCP server ยท External

Parse crypto CSVs and bank PDFs into clean transaction data for Koinly, TurboTax, CoinLedger.

Document data extractionv0.1.2TypeScript
Freeno charge per call

Runs on your machine from its package; the steps are below.

What it does

  1. Reads
  2. Writes
  3. High impact

At most: only reads or looks up information.

What it costs

Free

Odel charges nothing per call. The publisher may charge for its own service.

Runs locally over stdio

This server isn't hosted โ€” your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).

npm@taxformatter/mcp-serverv0.1.2

Run

npx -y @taxformatter/mcp-server

MCP client config

{
  "mcpServers": {
    "taxformatter": {
      "command": "npx",
      "args": [
        "-y",
        "@taxformatter/mcp-server"
      ]
    }
  }
}
README8 min read

๐Ÿ“Š TaxFormatter

Crypto CSVs and bank statement PDFs, parsed into tax-ready data.

REST API ยท MCP Server ยท Node SDK ยท Python SDK ยท Consumer Dashboard

API MCP Node SDK License


๐Ÿš€ What It Does

TaxFormatter turns messy financial exports into structured, tax-ready data โ€” for humans and for AI agents.

Drop a CSV from Coinbase, a ZIP from Kraken, a .tar.gz from Binance, or a PDF statement from Chase, and get back a clean, normalized transaction set you can pipe into Koinly, TurboTax, CoinLedger, ZenLedger โ€” or straight into your own software.

   Exchange CSV                        Clean, normalized
   Bank PDF              โ†’             transactions (JSON / CSV)
   XLSX / ZIP / TAR.GZ                 + AI-generated insights

โœจ Features

๐Ÿ”Œ Developer REST API

Ship a crypto-tax or bank-ingestion feature into your product in an afternoon.

  • POST /v1/parse โ€” upload a CSV or PDF, get structured JSON back
  • GET /v1/sources โ€” list every supported exchange, bank, and output format, each with a verified / beta status
  • GET /v1/usage โ€” monthly quota, RPM limit, current consumption
  • GET /v1/health โ€” liveness probe
  • Auth: X-API-Key header with tf_live_* keys (SHA-256 hashed at rest)
  • Host: https://api.taxformatter.com

๐Ÿค– MCP Server for AI Agents

Give Claude, Cursor, Windsurf, or any MCP-compatible agent the ability to parse crypto and bank data directly.

bash
npx @taxformatter/mcp-server
ToolWhat it does
parse_crypto_csvAuto-detects the exchange, returns normalized transactions
parse_bank_statementExtracts transactions from bank statement PDFs
list_supported_sourcesQueries every supported source + output format

๐Ÿ“ฆ Official SDKs

๐Ÿฆ 14 Exchanges ยท 6 Banks ยท 4 Export Formats

Every public supported-source claim is generated from two registries, and drift tests fail CI if any surface disagrees with them:

GET /v1/sources serves the same lists. Every entry carries a status: verified means a fixture-backed parse test runs on every change; beta means the parser exists but has no fixture yet. A new status is earned by a test, never by editing a registry.

Exchanges (verified): Binance ยท Coinbase ยท Kraken ยท KuCoin ยท Bybit ยท Cash App ยท Robinhood ยท PayPal ยท Crypto.com ยท Gemini ยท FTX ยท Bitfinex ยท OKX

Exchanges (beta): Venmo

Banks (verified): Chase ยท Mercury ยท Navy Federal

Banks (beta): Bank of America ยท Wells Fargo ยท Citi

Export formats: Koinly ยท TurboTax (Form 8949) ยท CoinLedger ยท ZenLedger

Per-exchange detail: content/docs/getting-started/supported-exchanges.md.

๐Ÿง  Tiered AI Insights

Every parsed file comes back with analysis scaled to your plan. Plans expose an insights level; the level โ†’ model mapping lives in lib/insights-engine.ts and is published only in the API docs and blog Updates posts.

LevelPlansOutput
StandardFree / StarterQuick stats + basic flagging
AdvancedGrowthBalanced analysis, breakdowns
PremiumBusinessDeep analysis + tax suggestions

The insights contract is strict. Model output is validated against a fixed schema, and a refusal, truncation, or unparseable response falls back to the deterministic quick stats with an insights unavailable warning rather than partial flags. Every result is stamped with the model, prompt version, and effort that produced it, and every model call logs tokens, cache-hit rate, latency, and cost.

๐Ÿ–ฅ๏ธ Consumer Dashboard

Not a developer? The web app at taxformatter.com is a full drag-and-drop experience with real-time job status, exchange auto-detection, transformation previews, and one-click downloads.


๐Ÿ—๏ธ Tech Stack

LayerTechnology
FrontendNext.js 16 ยท React 19 ยท TypeScript ยท Tailwind v4
AuthNextAuth (Google OAuth + email/password + 2FA)
DatabaseNeon (serverless PostgreSQL)
StorageAWS S3 (presigned URLs)
QueueAWS SQS + DLQ
ComputeAWS Lambda ร— 4 (scanner, processor, webhook, api)
EdgeAWS API Gateway + WAF + CloudFront
PaymentsStripe (consumer + developer tiers)
EmailAWS SES / Nodemailer
MonitoringSentry + CloudWatch
CronVercel Cron (daily 30-day retention prune)
IaCTerraform

๐Ÿ“ Repo Layout

trw/
โ”œโ”€โ”€ app/                 # Next.js App Router (marketing, dashboard, docs, blog)
โ”‚   โ”œโ”€โ”€ api/             # Internal API routes (NextAuth, uploads, jobs, dev keys, cron/prune)
โ”‚   โ”œโ”€โ”€ dashboard/       # Authenticated user area + /dashboard/developer
โ”‚   โ”œโ”€โ”€ docs/ ยท blog/    # MDX-powered docs site and blog (content in content/)
โ”‚   โ”œโ”€โ”€ playground/      # API playground
โ”‚   โ”œโ”€โ”€ samples/         # Sample outputs
โ”‚   โ””โ”€โ”€ upload/          # Anonymous bank statement โ†’ CSV landing page
โ”‚
โ”œโ”€โ”€ backend/             # Python processing layer (AWS Lambda)
โ”‚   โ”œโ”€โ”€ handlers/        # scanner ยท processor ยท webhook ยท api
โ”‚   โ”œโ”€โ”€ services/
โ”‚   โ”‚   โ”œโ”€โ”€ engine.py            # CSV parsing (14 exchange parsers)
โ”‚   โ”‚   โ”œโ”€โ”€ format_converter.py  # Koinly โ†’ TurboTax/CoinLedger/ZenLedger
โ”‚   โ”‚   โ”œโ”€โ”€ fingerprinting.py    # Exchange auto-detection
โ”‚   โ”‚   โ”œโ”€โ”€ ai_insights.py       # Tiered AI analysis (schema-validated, refusal-safe)
โ”‚   โ”‚   โ”œโ”€โ”€ api_auth.py          # API key validation + rate limiting
โ”‚   โ”‚   โ””โ”€โ”€ bank_statement/      # PDF extraction pipeline
โ”‚   โ”œโ”€โ”€ configs/
โ”‚   โ”‚   โ”œโ”€โ”€ exchanges.yaml       # Exchange source registry (serves /v1/sources)
โ”‚   โ”‚   โ””โ”€โ”€ banks/*.yaml         # Bank source registry + parser configs
โ”‚   โ”œโ”€โ”€ tests/                   # pytest suite + parse fixtures
โ”‚   โ””โ”€โ”€ terraform/               # Infra as code
โ”‚
โ”œโ”€โ”€ packages/
โ”‚   โ”œโ”€โ”€ mcp-server/      # @taxformatter/mcp-server (npm)
โ”‚   โ”œโ”€โ”€ sdk-node/        # @taxformatter/sdk (npm)
โ”‚   โ””โ”€โ”€ sdk-python/      # taxformatter (PyPI)
โ”‚
โ”œโ”€โ”€ components/          # React components (marketing, dashboard, ui)
โ”œโ”€โ”€ content/             # Docs (.md) and blog (.mdx) sources
โ”œโ”€โ”€ lib/                 # Business logic (auth, api-keys, stripe, email)
โ”‚   โ”œโ”€โ”€ exchange-registry.ts # Mirrors backend/configs/exchanges.yaml
โ”‚   โ”œโ”€โ”€ bank-registry.ts     # Mirrors backend/configs/banks/*.yaml
โ”‚   โ”œโ”€โ”€ tier-registry.ts     # The one price list (plan, price, quota, RPM, insights level)
โ”‚   โ”œโ”€โ”€ insights-engine.ts   # The one model list (insights level โ†’ model)
โ”‚   โ””โ”€โ”€ retention.ts         # RETENTION_DAYS = 30
โ”œโ”€โ”€ db/                  # PostgreSQL schema + migrations
โ”œโ”€โ”€ __tests__/           # Jest suite, incl. copy and registry drift guards
โ””โ”€โ”€ docs/                # Setup guides, plans, build reports

Full architectural reference: ARCHITECTURE.md


โšก Quick Start

Run the web app

bash
npm install
npm run dev

Open http://localhost:3000.

Try the API

bash
curl -X POST https://api.taxformatter.com/v1/parse \
  -H "X-API-Key: tf_live_..." \
  -F "file=@coinbase.csv"

Use the MCP server with Claude Code

json
{
  "mcpServers": {
    "taxformatter": {
      "command": "npx",
      "args": ["@taxformatter/mcp-server"],
      "env": { "TAXFORMATTER_API_KEY": "tf_live_..." }
    }
  }
}

Install the Node SDK

bash
npm install @taxformatter/sdk
ts
import { TaxFormatter } from "@taxformatter/sdk";

const tf = new TaxFormatter(process.env.TF_API_KEY!);

// Parse a file by path, or pass a Buffer with a filename
const result = await tf.parse("./coinbase.csv");
const turbotax = await tf.parse(buffer, "coinbase.csv", { outputFormat: "turbotax" });

Install the Python SDK

bash
pip install taxformatter
python
from taxformatter import TaxFormatter

tf = TaxFormatter("tf_live_...")
result = tf.parse("./coinbase.csv")

๐Ÿงช Testing

bash
npm test              # Jest (700+ tests: API routes, MCP, keys, registries, UI)
npm run test:e2e      # Playwright end-to-end tests
npm run typecheck     # TypeScript strict mode
npm run lint          # ESLint
cd backend && pytest  # Python engine, parsers, insights, API Lambda (370+ tests)

Public copy is tested too. Drift guards under __tests__/ fail if any surface hard-codes a price, quota, or model name outside the registries, names an exchange or bank the registries don't list, or carries a superseded retention or marketing claim.


๐Ÿ’ณ Pricing

One plan, two ways to use it โ€” drop a file in the dashboard or call our API. Same quota, same AI insights.

TierPriceQuotaRPMAI InsightsHighlights
Free$025 files10StandardAll exchanges ยท No credit card
Starter$29/mo100 files30StandardAll exchanges
Growth$99/mo500 files60Advanced+ Bank PDF parsing
Business$249/mo2,000 files120Premium+ Custom integrations

Source of truth: lib/tier-registry.ts (prices, quotas, limits) and lib/insights-engine.ts (which model serves each insights level). Model names are published in the API docs and blog Updates posts only.


๐Ÿ”’ Security Highlights

  • API payloads never stored โ€” request bodies are parsed in memory and never written to S3 or the database
  • Metadata-only request log โ€” api_requests stores key id, endpoint, status, bytes, timing, detected source, error code, and caller IP; never file contents
  • API keys SHA-256 hashed at rest, prefixed tf_live_ for easy identification
  • Uploads only โ€” TaxFormatter never asks for exchange API keys or bank logins
  • TLS 1.3 enforced everywhere
  • AES-256 encryption on all stored uploads
  • AWS WAF in front of the API
  • 30-day retention โ€” uploads, outputs, and parsed rows are deleted within 30 days (sooner from the dashboard); enforced by an S3 lifecycle rule and a daily prune cron

Full disclosure at taxformatter.com/security.


๐Ÿ“š Documentation


License

Source-available, not open source. Copyright (c) 2026 Quantum Transfer Group, all rights reserved โ€” you may read and audit this code, but not run, copy, or build on it. Full terms in LICENSE; the published npm and PyPI client packages are licensed separately.

Security

Found a vulnerability? Report it privately โ€” see SECURITY.md. Please don't open a public issue.

Contributing

Bug reports are welcome, especially parsing failures against real exchange or bank exports. We don't accept outside pull requests โ€” see CONTRIBUTING.md.

Similar modules

Browse Document data extraction