Moltline TaxLots

com.moltlinestudioPublished by moltlinestudio.comOfficial publisherv1.2.0Updated Oct 24, 2026

Crypto cost-basis lots (FIFO/LIFO/HIFO/specific-ID), Form 8949 rows, 1099-DA diff. 5 of 8 free.

The publisher's own server: Moltline Business Suite

VerifiedStreamable HTTPWeb executableFinanceData & Analytics

Overview

AI-generated overview

Hosted MCP server that turns crypto exchange CSV exports into cost-basis lots, Form 8949 rows and 1099-DA reconciliations.

What you can do
  • Parse exchange CSV exports (Coinbase, Kraken, generic) into canonical ledger rows
  • Lint a ledger for missing values, duplicates and negative balances
  • Match withdrawals to deposits between your own accounts
  • Build lot inventory and disposals with FIFO, LIFO, HIFO or specific-ID basis
  • Lay disposals out as Form 8949 rows and diff them against broker 1099-DA lines
  • Flag wash-sale windows and compute impermanent loss for two-asset LP positions
When to use it
Useful when preparing US crypto tax reporting: normalising exchange exports, checking a ledger for errors, computing gains and holding periods, and comparing results with a broker's 1099-DA. The free tools cover parsing, linting, transfer matching, wash-window checks and LP math without an account.
Requirements
Remote Streamable HTTP endpoint; no install, account or credentials needed for the free tier. Premium tools (build_lots, form_8949_rows, reconcile_1099da) need a Moltline license, sent as the X-Moltline-License header (MOLTLINE_LICENSE in the stdio bridge). A stdio-only client can use the Python 3.9+ bridge script or Docker, which needs network egress.
Before you install
Ledger data you submit is sent to a third-party hosted service. Three of the eight tools are premium and require a purchased license; the free tools work anonymously. Output is computational assistance for tax figures, not tax advice, and results depend on the accuracy of the CSV exports you supply.

Installation

In SourceWeft

  1. Open Moltline TaxLots in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/com.moltlinestudio%2Ftaxlots/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "moltline-taxlots": {
      "type": "http",
      "url": "https://mcp.moltlinestudio.com/taxlots"
    }
  }
}

README

moltline-mcp

A thin, dependency-free stdio bridge to Moltline Studio's fleet of 22 hosted MCP servers.

Most modern MCP clients can connect to the fleet directly over Streamable HTTP, no install needed (see Direct connection below). This bridge exists for clients that only speak the stdio transport: it proxies newline-delimited JSON-RPC between your client and the hosted server, verbatim, with no telemetry and no dependencies beyond the Python 3.9+ standard library.

  • 160 tools across 22 servers; 110 are free.
  • Free tier: no registration, no account, no credentials. Connect and call tools immediately.
  • Premium tools are unlocked with a Moltline license. Set MOLTLINE_LICENSE in your MCP client's environment; the bridge sends it as the X-Moltline-License header and never writes it to argv, URLs or logs. See auth.md.
  • Independently checked by MCPize on the direct endpoints (scans of 5–6 September 2026: 6 A+, 15 A, 1 B+; scores 89–98). All 22 servers score 100 on clarity, 100 on reliability and 100 on trust, 95 on protocol and 87 on safety; the one finding raised on every server is that the free tier accepts anonymous access (which is the point of it), and the spread between servers sits in MCPize's "Market" dimension (a crowded category). Each server's MCPize listing links its own public result.

Find it on: Smithery · MCPize · Glama · Clawmart · MCP Registry

The fleet

ServerToolsWhat it does
catalog10Search 138 agent skills and personas by plain-language job; preview any product.
codereview7Risk-scan a diff, flag AI-generated-code tells, find secrets, report complexity.
govern8Audit an MCP config or SKILL.md for over-broad scope and prompt-injection risk.
timeops5Business days, meeting overlap, recurrence expansion, deadline and SLA math.
data7Paste-your-data analytics: CSV profiling, A/B tests, correlation, growth, cohorts.
humanizer5Find AI-isms with evidence, fingerprint a writing voice, measure burstiness.
business830 finance, bookkeeping, legal-ops and SMB operations persona-skill products.
creator820 blogging, brand-voice, copywriting, video and social persona-skill products.
educator78 curriculum, classroom, accommodations and exam-prep persona-skill products.
outbound87 outreach, sequencing, deliverability, call-coaching and CRM-hygiene products.
personal920 inbox, calendar, travel, meals and family-logistics persona-skill products.
research87 research navigation, thesis, note-taking and citation persona-skill products.
skillmd-lint6Lint a SKILL.md for frontmatter, structure, secrets and size. All tools free.
merchant6Commerce arithmetic: processor fees, charge-to-net, invoice totals, proration.
shipping6Dimensional weight, parcel fit, landed cost, freight class, rate cards.
shopify6Check a product CSV, URL handles, variant matrices and metafield keys.
dropship6Dropshipping unit economics: margin, lead time, SKU mapping, price ladders.
recall6A portable knowledge-graph memory you pass in and get back. No database.
vision6Image header probing, bbox conversion, resize plans, color and detection math.
regclock9Incident-reporting deadlines from the legal text (EU CRA, NIS2, DORA, GDPR, UK GDPR, HIPAA, SEC 8-K), cited.
taxlots8Crypto cost basis: parse exchange CSVs, lint, match transfers, FIFO/LIFO/HIFO lots, Form 8949 rows, 1099-DA diff.
optimize11OR-Tools routing, 3-D packing, 1-D/2-D cutting, knapsack and shift rostering with stated limits.

Machine-readable discovery: api-catalog · per-server card at https://mcp.moltlinestudio.com/<server>/.well-known/mcp/server-card.json · fleet health.

Direct connection (preferred)

If your MCP client supports Streamable HTTP (Claude Desktop, Claude Code, Cursor, and most current clients do), point it straight at the hosted endpoint (nothing to install):

json
{  "mcpServers": {    "moltline-timeops": {      "type": "http",      "url": "https://mcp.moltlinestudio.com/timeops"    }  }}

Swap timeops for any slug in the table above.

The stdio bridge (for stdio-only clients)

Install

Run directly (recommended): the bridge is a single stdlib-only file, so a clone is all you need:

bash
git clone https://github.com/GarphenGate/moltline-mcp.gitpython3 moltline-mcp/moltline_mcp.py timeops   # any of the 22 slugs; default: catalog

Docker: see Docker below if you prefer a container.

A PyPI package is planned; until then, use the methods above.

Client configuration

Point your MCP client at the script with an absolute path:

json
{  "mcpServers": {    "moltline-timeops": {      "command": "python3",      "args": ["/absolute/path/to/moltline-mcp/moltline_mcp.py", "timeops"]    }  }}

Or run it through Docker (after docker build -t moltline-mcp .):

json
{  "mcpServers": {    "moltline-timeops": {      "command": "docker",      "args": ["run", "-i", "--rm", "moltline-mcp", "timeops"]    }  }}

CLI

text
python3 moltline_mcp.py [server] [--timeout SECONDS] [--list] [--version]
  • server: one of the 22 slugs (default catalog); anything else fails fast with the valid list.
  • --timeout: per-request timeout in seconds (default 300, or env MOLTLINE_TIMEOUT).
  • --list: print the server slugs and exit.
  • Env MOLTLINE_BASE_URL: override the fleet base URL (for testing).
  • Env MOLTLINE_LICENSE: your Moltline license, sent as the X-Moltline-License header to unlock premium tools. Omit it and the bridge runs free-tier only.
  • Env MOLTLINE_DEBUG=1: diagnostic logging on stderr (stdout stays protocol-clean). The license is never logged; debug output reports only whether one is configured.

Docker

The bridge also runs containerized (stdio in, network egress to the fleet required):

bash
docker build -t moltline-mcp .docker run -i --rm moltline-mcp timeops   # any of the 22 slugs; default: catalog

See Client configuration for the matching mcpServers entry.

How it works

One process per server connection. Each JSON-RPC message read from stdin is POSTed to https://mcp.moltlinestudio.com/<server>; JSON and SSE-framed responses are relayed back to stdout as newline-delimited JSON. The bridge tracks the server-assigned Mcp-Session-Id and echoes the negotiated MCP-Protocol-Version, per the Streamable HTTP transport spec. It never inspects, stores, or reports your traffic.

Tests

The bridge ships with an offline test suite - no network, no dependencies:

bash
python -m unittest -v

Twenty-two tests cover the parts that actually break in a transport bridge: newline-delimited framing, SSE event splitting (multiple events, multi-line data: payloads, a trailing event with no blank line, comments and named events), session-id capture and reuse, protocol-version negotiation on initialize only, and error relay - a JSON-RPC error document is passed through verbatim, anything else becomes a well-formed -32603. CI runs them on Python 3.9, 3.12 and 3.13, plus a Docker build and container smoke test.

Access and licensing

  • Free tier: anonymous. No registration or credentials; all free tools work immediately.
  • Premium: unlocked with a Moltline license purchased (human-in-the-loop) at moltlinestudio.com. Set MOLTLINE_LICENSE in the environment and the bridge forwards it as the X-Moltline-License request header. It is deliberately not a command-line flag: argv is world-readable through ps. It is never placed in a URL and never logged. Details: auth.md.

Links

License

MIT © 2026 Moltline Studio

Source: README.md at commit bbf91e4

Tools

8

parse_transactions

Parse Transactions

Normalise an exchange CSV export into the canonical ledger rows. FREE. Supports the Coinbase transaction-history export (Transaction Type / Asset / Quantity Transacted columns), the Kraken ledgers export (txid / refid / type / asset / amount / fee) and a generic CSV with the canonical columns ts, type, asset, qty, fiat_value, fee_qty, fee_asset, fee_fiat, counter_asset, counter_qty, account, id. Typical input {"csv_text": "...", "source_hint": "coinbase"} returns {"rows": [...], "detected": "coinbase", "unrecognised": [...], "warnings": [...]}. Rows it cannot read are returned under unrecognised with the reason, never dropped silently. In every row qty is the whole amount that entered or left the account; when a fee was paid in the same asset, fee_qty is the part of qty that was the fee. Use before ledger_lint and build_lots. Not for other exchanges: convert those to the generic columns first. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "csv_text must be the CSV file contents"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersaccountcsv_textrequiredsource_hint

ledger_lint

Ledger Lint

Find the problems that break a lot build: missing values, duplicates, negative balances. FREE. Typical input {"ledger": <rows from parse_transactions>} returns {"issues": [{"severity": "error", "row": "cb12", "issue": "sell of 0.5 BTC exceeds balance 0.2 in account coinbase"}], "balances": {"coinbase": {"BTC": "0.2"}}, "counts": {...}}. Balances are running quantities per account and asset in time order, ignoring transfers' fiat values. Use after parse_transactions and before build_lots. Not a tax check: it checks the ledger's arithmetic consistency only. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersledgerrequired

match_transfers

Match Transfers

Pair withdrawals with the deposits that received them between your own accounts. FREE. Typical input {"ledger": <rows>, "window_minutes": 1440} returns {"pairs": [{"out": "kr91", "in": "cb14", "asset": "BTC", "from": "kraken", "to": "coinbase", "network_fee": "0.0001", "minutes": 42.0}], "unmatched": {"transfer_out": [...], "transfer_in": [...]}}. A pair needs the same asset, a different account, the deposit inside the window after the withdrawal, and a quantity within tolerance_pct of the amount sent net of the fee. Use before build_lots so basis and holding period move with the coins instead of being treated as a sale. Not for transfers to third parties: those stay unmatched and should be typed gift_out or sell. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersledgerrequiredtolerance_pctwindow_minutes

build_lots

Build Lots

Build the lot inventory per account and every disposal with basis, gain and holding period. PREMIUM (license). Methods: fifo (the default rule when no specific identification is made, Treas. Reg. 1.1012-1(j)), lifo, hifo, or specific_id via a row's specific_lots {lot_id: qty}. Typical input {"ledger": <rows>, "method": "hifo", "transfers": <pairs from match_transfers>} returns {"disposals": [{"row": "cb9", "asset": "BTC", "qty": "0.5", "proceeds": "31000.00", "basis": "20000.00", "gain": "11000.00", "term": "long", ...}], "open_lots": [...], "summary": {"short_term": {...}, "long_term": {...}}}. Fees: a cash purchase's fee joins basis; a sale's or exchange's fee reduces the amount realized (1.1001-7); a network fee paid in the transferred asset is a disposal of those units (transfer_fee_policy dispose) unless you choose ignore. Transfers between your own accounts move lots with their basis and acquisition date. Use once ledger_lint reports no errors. Not tax advice: it applies the stated rules to your rows and shows its work. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "method must be fifo, lifo, hifo or specific_id"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersledgerrequiredmethodtax_yeartransferson_missing_lotstransfer_fee_policy

form_8949_rows

Form 8949 Rows

Lay the disposals out as Form 8949 rows with box categories and totals. PREMIUM (license). Typical input {"disposals": <from build_lots>, "tax_year": 2026, "default_reporting": "proceeds_only"} returns {"part_i": {"B": [rows]}, "part_ii": {"E": [rows]}, "totals": {...}}. Columns follow the form: description (a), date acquired (b), date sold (c), proceeds (d), cost or other basis (e), code (f), adjustment (g), gain or loss (h). Box: A/D when the broker reported proceeds and basis, B/E when proceeds only, C/F when no broker form - set per row in reporting {row_id: value} or for all rows with default_reporting. Use to draft the schedule from computed disposals. Not a filing: check the current form instructions. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "disposals must be a non-empty list from build_lots"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parameterstax_yearrequireddisposalsrequiredreportingwhole_dollarsdefault_reporting

reconcile_1099da

Reconcile 1099Da

Diff the broker's 1099-DA lines against the computed disposals. PREMIUM (license). Typical input {"disposals": <from build_lots>, "form_rows": [{"asset": "BTC", "date_sold": "2026-03-04", "qty": "0.5", "proceeds": "31000", "basis": "", "account": "coinbase"}]} returns {"matched": [...], "broker_missing_basis": [...], "basis_mismatch": [...], "proceeds_mismatch": [...], "unmatched_form_rows": [...], "unmatched_disposals": [...]}. A line matches a disposal on the same account (when given), asset and sale date with quantity and proceeds inside the tolerances; several lots sold in one order are summed first. Use when the form arrives and the basis column is blank for coins that came from your own wallet. Not a substitute for the broker's statement. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "disposals must be a non-empty list from build_lots"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersdisposalsrequiredform_rowsrequiredmoney_toleranceqty_tolerance_pct

wash_window_check

Wash Window Check

Flag loss disposals with a repurchase of the same asset inside the window. FREE. Typical input {"disposals": <from build_lots>, "acquisitions": [{"asset": "ETH", "ts": "2026-02-10T10:00:00Z", "qty": "2"}]} returns {"flags": [{"row": "cb7", "asset": "ETH", "loss": "-410.00", "repurchases": [...]}], "rule_status": "..."}. The 30-day window before and after the sale is the one IRC 1091 uses for stock or securities; as checked on the verification date that statute had not been extended to digital assets that are not securities, so the output is a heads-up for planning, not an adjustment. Use when reviewing loss harvesting. Not a determination that any rule applies. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "disposals and acquisitions must be lists"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersdisposalsrequiredwindow_daysacquisitionsrequired

lp_position_math

Lp Position Math

Impermanent loss, hold-vs-pool value and basis split for a two-asset constant-product pool. FREE. Typical input {"deposit": {"asset_a": "ETH", "qty_a": "1", "price_a": "2000", "asset_b": "USDC", "qty_b": "2000", "price_b": "1"}, "current_prices": {"ETH": "3000", "USDC": "1"}} returns {"il_pct": "-2.02", "hold_value": "5000.00", "pool_value": "4898.98", "deposit_value": "4000.00", "basis_split": {...}}. The pool value assumes x*y=k with no fees; add fees_earned_fiat to see the net. The basis split is the deposit's fiat value at deposit, allocated by each side's share, which is the arithmetic a lot engine needs if the LP position is treated as one asset. Use for DeFi position reviews. Not a determination of whether the deposit is a taxable exchange. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "deposit and current_prices must be objects"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

Parametersdepositrequiredcurrent_pricesrequiredfees_earned_fiat

Version history

1
  1. v1.2.0LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Moltlinestudio integrations