Server definition
- Hash
- sha256:9f4b9d08f5ad997dab23f9e8b2fb90eae630fd57f83faf64a94cc9d7c29628e8
- What it is
- What a remote MCP server returned when asked what it offers: 8 tools
The blob, as servednamed by its sha256
{
"instructions": "Crypto cost-basis engine over MCP. Free: parse_transactions, ledger_lint, match_transfers, wash_window_check, lp_position_math. Premium (license): build_lots (FIFO/LIFO/HIFO/specific-ID per account), form_8949_rows, reconcile_1099da. Decimal maths on your own ledger; nothing stored. Not tax advice.",
"tools": [
{
"description": "Build the lot inventory per account and every disposal with basis, gain and holding period. PREMIUM (license).\n\nMethods: fifo (the default rule when no specific identification is made,\nTreas. Reg. 1.1012-1(j)), lifo, hifo, or specific_id via a row's\nspecific_lots {lot_id: qty}. Typical input {\"ledger\": <rows>, \"method\":\n\"hifo\", \"transfers\": <pairs from match_transfers>} returns {\"disposals\":\n[{\"row\": \"cb9\", \"asset\": \"BTC\", \"qty\": \"0.5\", \"proceeds\": \"31000.00\",\n\"basis\": \"20000.00\", \"gain\": \"11000.00\", \"term\": \"long\", ...}],\n\"open_lots\": [...], \"summary\": {\"short_term\": {...}, \"long_term\":\n{...}}}. Fees: a cash purchase's fee joins basis; a sale's or exchange's\nfee reduces the amount realized (1.1001-7); a network fee paid in the\ntransferred asset is a disposal of those units (transfer_fee_policy\ndispose) unless you choose ignore. Transfers between your own accounts\nmove lots with their basis and acquisition date. Use once ledger_lint\nreports no errors. Not tax advice: it applies the stated rules to your\nrows 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ledger": {
"description": "canonical rows.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"method": {
"default": "fifo",
"description": "fifo, lifo, hifo or specific_id (rows without specific_lots fall back to fifo).",
"type": "string"
},
"on_missing_lots": {
"default": "error",
"description": "error (default), or zero_basis for lenient mode - disposals beyond the lots held get zero basis and unmatched transfer_out rows simply leave the inventory, each flagged.",
"type": "string"
},
"tax_year": {
"default": 0,
"description": "when set, only disposals in that calendar year are returned (the inventory still runs from the start).",
"maximum": 2100,
"minimum": 2009,
"type": "integer"
},
"transfer_fee_policy": {
"default": "dispose",
"description": "dispose (default) or ignore for network fees paid in the transferred asset.",
"type": "string"
},
"transfers": {
"default": [],
"description": "pairs from match_transfers ({\"out\": id, \"in\": id, ...}); empty to auto-match with the defaults.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
}
},
"required": [
"ledger"
],
"type": "object"
},
"name": "build_lots",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Lay the disposals out as Form 8949 rows with box categories and totals. PREMIUM (license).\n\nTypical input {\"disposals\": <from build_lots>, \"tax_year\": 2026,\n\"default_reporting\": \"proceeds_only\"} returns {\"part_i\": {\"B\": [rows]},\n\"part_ii\": {\"E\": [rows]}, \"totals\": {...}}. Columns follow the form:\ndescription (a), date acquired (b), date sold (c), proceeds (d), cost or\nother basis (e), code (f), adjustment (g), gain or loss (h). Box: A/D\nwhen the broker reported proceeds and basis, B/E when proceeds only, C/F\nwhen no broker form - set per row in reporting {row_id: value} or for\nall rows with default_reporting. Use to draft the schedule from computed\ndisposals. 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"default_reporting": {
"default": "none",
"description": "proceeds_and_basis, proceeds_only or none (default).",
"type": "string"
},
"disposals": {
"description": "rows from build_lots.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"reporting": {
"additionalProperties": true,
"default": {},
"description": "per-row override: proceeds_and_basis, proceeds_only or none.",
"type": "object"
},
"tax_year": {
"description": "the calendar year of the disposals to include.",
"maximum": 2100,
"minimum": 2009,
"type": "integer"
},
"whole_dollars": {
"default": false,
"description": "round each row to whole dollars as the form permits.",
"type": "boolean"
}
},
"required": [
"disposals",
"tax_year"
],
"type": "object"
},
"name": "form_8949_rows",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Find the problems that break a lot build: missing values, duplicates, negative balances. FREE.\n\nTypical input {\"ledger\": <rows from parse_transactions>} returns\n{\"issues\": [{\"severity\": \"error\", \"row\": \"cb12\", \"issue\": \"sell of 0.5\nBTC exceeds balance 0.2 in account coinbase\"}], \"balances\": {\"coinbase\":\n{\"BTC\": \"0.2\"}}, \"counts\": {...}}. Balances are running quantities per\naccount and asset in time order, ignoring transfers' fiat values. Use\nafter parse_transactions and before build_lots. Not a tax check: it\nchecks 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ledger": {
"description": "canonical rows (ts, type, asset, qty, fiat_value, fees, account...).",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
}
},
"required": [
"ledger"
],
"type": "object"
},
"name": "ledger_lint",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Impermanent loss, hold-vs-pool value and basis split for a two-asset constant-product pool. FREE.\n\nTypical input {\"deposit\": {\"asset_a\": \"ETH\", \"qty_a\": \"1\", \"price_a\":\n\"2000\", \"asset_b\": \"USDC\", \"qty_b\": \"2000\", \"price_b\": \"1\"},\n\"current_prices\": {\"ETH\": \"3000\", \"USDC\": \"1\"}} returns {\"il_pct\":\n\"-2.02\", \"hold_value\": \"5000.00\", \"pool_value\": \"4898.98\",\n\"deposit_value\": \"4000.00\", \"basis_split\": {...}}. The pool value assumes\nx*y=k with no fees; add fees_earned_fiat to see the net. The basis split\nis the deposit's fiat value at deposit, allocated by each side's share,\nwhich is the arithmetic a lot engine needs if the LP position is treated\nas one asset. Use for DeFi position reviews. Not a determination of\nwhether 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"current_prices": {
"additionalProperties": true,
"description": "{asset: price} for both assets now.",
"type": "object"
},
"deposit": {
"additionalProperties": true,
"description": "asset_a, qty_a, price_a, asset_b, qty_b, price_b at the time of deposit.",
"type": "object"
},
"fees_earned_fiat": {
"default": 0,
"description": "fees accrued to the position, in fiat.",
"minimum": 0,
"type": "number"
}
},
"required": [
"deposit",
"current_prices"
],
"type": "object"
},
"name": "lp_position_math",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Pair withdrawals with the deposits that received them between your own accounts. FREE.\n\nTypical input {\"ledger\": <rows>, \"window_minutes\": 1440} returns\n{\"pairs\": [{\"out\": \"kr91\", \"in\": \"cb14\", \"asset\": \"BTC\", \"from\":\n\"kraken\", \"to\": \"coinbase\", \"network_fee\": \"0.0001\", \"minutes\": 42.0}],\n\"unmatched\": {\"transfer_out\": [...], \"transfer_in\": [...]}}. A pair needs\nthe same asset, a different account, the deposit inside the window after\nthe withdrawal, and a quantity within tolerance_pct of the amount sent\nnet of the fee. Use before build_lots so basis and holding period move\nwith the coins instead of being treated as a sale. Not for transfers to\nthird 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ledger": {
"description": "canonical rows.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"tolerance_pct": {
"default": 1,
"description": "allowed quantity difference in percent after the fee (default 1).",
"maximum": 25,
"minimum": 0,
"type": "number"
},
"window_minutes": {
"default": 1440,
"description": "how long after the withdrawal the deposit may land (default one day).",
"maximum": 20160,
"minimum": 1,
"type": "integer"
}
},
"required": [
"ledger"
],
"type": "object"
},
"name": "match_transfers",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Normalise an exchange CSV export into the canonical ledger rows. FREE.\n\nSupports the Coinbase transaction-history export (Transaction Type /\nAsset / Quantity Transacted columns), the Kraken ledgers export (txid /\nrefid / type / asset / amount / fee) and a generic CSV with the canonical\ncolumns ts, type, asset, qty, fiat_value, fee_qty, fee_asset, fee_fiat,\ncounter_asset, counter_qty, account, id. Typical input {\"csv_text\":\n\"...\", \"source_hint\": \"coinbase\"} returns {\"rows\": [...], \"detected\":\n\"coinbase\", \"unrecognised\": [...], \"warnings\": [...]}. Rows it cannot\nread are returned under unrecognised with the reason, never dropped\nsilently. In every row qty is the whole amount that entered or left the\naccount; when a fee was paid in the same asset, fee_qty is the part of\nqty that was the fee. Use before ledger_lint and build_lots. Not for\nother 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"account": {
"default": "",
"description": "account label to stamp on every row (defaults to the source name).",
"type": "string"
},
"csv_text": {
"description": "the CSV file contents (up to 2 MB).",
"type": "string"
},
"source_hint": {
"default": "",
"description": "coinbase, kraken or generic; empty to detect from the header.",
"type": "string"
}
},
"required": [
"csv_text"
],
"type": "object"
},
"name": "parse_transactions",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Diff the broker's 1099-DA lines against the computed disposals. PREMIUM (license).\n\nTypical input {\"disposals\": <from build_lots>, \"form_rows\": [{\"asset\":\n\"BTC\", \"date_sold\": \"2026-03-04\", \"qty\": \"0.5\", \"proceeds\": \"31000\",\n\"basis\": \"\", \"account\": \"coinbase\"}]} returns {\"matched\": [...],\n\"broker_missing_basis\": [...], \"basis_mismatch\": [...],\n\"proceeds_mismatch\": [...], \"unmatched_form_rows\": [...],\n\"unmatched_disposals\": [...]}. A line matches a disposal on the same\naccount (when given), asset and sale date with quantity and proceeds\ninside the tolerances; several lots sold in one order are summed first.\nUse when the form arrives and the basis column is blank for coins that\ncame 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"disposals": {
"description": "rows from build_lots.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"form_rows": {
"description": "1099-DA lines: asset, date_sold, qty, proceeds, basis (may be blank), account (optional), id (optional).",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"money_tolerance": {
"default": 1,
"description": "allowed proceeds/basis difference in fiat units (default 1.00).",
"maximum": 1000,
"minimum": 0,
"type": "number"
},
"qty_tolerance_pct": {
"default": 0.5,
"description": "allowed quantity difference in percent (default 0.5).",
"maximum": 10,
"minimum": 0,
"type": "number"
}
},
"required": [
"disposals",
"form_rows"
],
"type": "object"
},
"name": "reconcile_1099da",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Flag loss disposals with a repurchase of the same asset inside the window. FREE.\n\nTypical input {\"disposals\": <from build_lots>, \"acquisitions\":\n[{\"asset\": \"ETH\", \"ts\": \"2026-02-10T10:00:00Z\", \"qty\": \"2\"}]} returns\n{\"flags\": [{\"row\": \"cb7\", \"asset\": \"ETH\", \"loss\": \"-410.00\",\n\"repurchases\": [...]}], \"rule_status\": \"...\"}. The 30-day window before\nand after the sale is the one IRC 1091 uses for stock or securities; as\nchecked on the verification date that statute had not been extended to\ndigital assets that are not securities, so the output is a heads-up for\nplanning, not an adjustment. Use when reviewing loss harvesting. Not a\ndetermination 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.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"acquisitions": {
"description": "purchases/income rows with asset, ts, qty (ledger rows work as-is).",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"disposals": {
"description": "rows from build_lots (uses asset, disposed_at, gain, row).",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"window_days": {
"default": 30,
"description": "days before and after the loss disposal to scan (default 30).",
"maximum": 90,
"minimum": 1,
"type": "integer"
}
},
"required": [
"disposals",
"acquisitions"
],
"type": "object"
},
"name": "wash_window_check",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:9f4b9d08f5ad997dab23f9e8b2fb90eae630fd57f83faf64a94cc9d7c29628e8 | sha256sum