Your accounting ledger as typed tools: net worth, holdings, history, tax estimates, trade logging.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Net worth, balance sheet and current holdings, in the ledger's base currency.
This tool takes no arguments.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Net worth, balance sheet and current holdings, in the ledger's base currency.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Historical net-worth snapshots (one point per day where recorded).
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Current price per ticker with its source, quote currency and recent change, plus any manual overrides.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}The forecast/FIRE plan's assumptions (salary, expenses, inflation, retirement dates, tax mode). The projection itself is computed client-side.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Valid accounts, providers, tickers, asset classes and categories. Read this before writing: trades and adjustments must use these values unless allow_new_values is set.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Capital-gains / income tax estimate for a year: gains, losses, exemption (including any carried-forward amount), taxable base and estimated tax.
| Argument | Type | Description |
|---|---|---|
| year | string | Defaults to the current year |
| account | string | One portfolio; absent sums every configured one |
{
"type": "object",
"required": [],
"properties": {
"year": {
"type": "string",
"description": "Defaults to the current year"
},
"account": {
"type": "string",
"description": "One portfolio; absent sums every configured one"
}
}
}Linked exchange, bank and wallet connections, each with its sync mode (balance updates, or transactions staged for review) and when it last synced.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Transaction history as a human-friendly list, newest first.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Log a trade (buy / sell / swap), expressed as from-asset to to-asset. Same body and validation as POST /api/transactions.
| Argument | Type | Description |
|---|---|---|
| to_risk | integer | |
| tx_date* | string | Today or tomorrow at the latest (the user's own calendar day); later dates are rejected |
| tx_time | string | Optional HH:MM on the user's own clock; orders rows within the same day. Omitted: an edit keeps the stored time, a new row takes the current time |
| to_asset* | string | |
| from_risk | integer | |
| to_amount* | number | |
| to_ticker* | string | |
| from_asset* | string | |
| to_account* | string | |
| description | string |
Record a signed quantity change on one holding (a balance update that is not a trade). Same body and validation as POST /api/position-adjustments.
| Argument | Type | Description |
|---|---|---|
| asset* | string | |
| ticker* | string | |
| account* | string | |
| tx_date* | string | Today or tomorrow at the latest (the user's own calendar day); later dates are rejected |
| tx_time | string | Optional HH:MM on the user's own clock; orders rows within the same day. Omitted: an edit keeps the stored time, a new row takes the current time |
| provider* | string | |
| quantity_delta* | number | Signed quantity change (non-zero) |
| allow_new_values | boolean |
{
"type": "object",
"required": [
"tx_date",
"account",
"provider",
"ticker",
"asset",
"quantity_delta"
],
"properties": {
"asset": {
"type": "string"
},
"ticker": {
"type": "string"
},
"account": {
"type": "string"
},
"tx_date": {
"type": "string",
"format": "date",
"description": "Today or tomorrow at the latest (the user's own calendar day); later dates are rejected"
},
"tx_time": {
"type": "string",
"example": "14:30",
"description": "Optional HH:MM on the user's own clock; orders rows within the same day. Omitted: an edit keeps the stored time, a new row takes the current time"
},
"provider": {
"type": "string"
},
"quantity_delta": {
"type": "number",
"description": "Signed quantity change (non-zero)"
},
"allow_new_values": {
"type": "boolean"
}
}
}Fetch fresh market prices now. With no ticker this refreshes every priced holding; with one it refreshes just that ticker.
| Argument | Type | Description |
|---|---|---|
| symbol | string | Provider symbol when it differs from the ticker |
| ticker | string | Omit to refresh every ticker |
{
"type": "object",
"required": [],
"properties": {
"symbol": {
"type": "string",
"description": "Provider symbol when it differs from the ticker"
},
"ticker": {
"type": "string",
"description": "Omit to refresh every ticker"
}
}
}Sync every linked connection in one pass: push the latest balance into each linked holding, and stage new transactions into the review queue. Reports what was written, what was staged and any per-provider errors.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}| from_amount* | number |
| from_ticker* | string |
| to_category | string |
| to_provider* | string |
| from_account* | string |
| from_category | string |
| from_provider* | string |
| to_description | string |
| allow_new_values | boolean | Create accounts/providers/tickers not yet in reference-data. Default false. |
| from_description | string |
| overall_eur_value* | number | The trade's total value in the ledger's base currency (the field name is historical: EUR was the only base) |
{
"type": "object",
"required": [
"tx_date",
"from_account",
"from_provider",
"from_ticker",
"from_asset",
"from_amount",
"to_account",
"to_provider",
"to_ticker",
"to_asset",
"to_amount",
"overall_eur_value"
],
"properties": {
"to_risk": {
"type": "integer",
"maximum": 4,
"minimum": 0
},
"tx_date": {
"type": "string",
"format": "date",
"example": "2026-06-17",
"description": "Today or tomorrow at the latest (the user's own calendar day); later dates are rejected"
},
"tx_time": {
"type": "string",
"example": "14:30",
"description": "Optional HH:MM on the user's own clock; orders rows within the same day. Omitted: an edit keeps the stored time, a new row takes the current time"
},
"to_asset": {
"type": "string"
},
"from_risk": {
"type": "integer",
"maximum": 4,
"minimum": 0
},
"to_amount": {
"type": "number",
"example": 8.5
},
"to_ticker": {
"type": "string"
},
"from_asset": {
"type": "string"
},
"to_account": {
"type": "string"
},
"description": {
"type": "string"
},
"from_amount": {
"type": "number",
"example": 1000
},
"from_ticker": {
"type": "string"
},
"to_category": {
"type": "string"
},
"to_provider": {
"type": "string"
},
"from_account": {
"type": "string"
},
"from_category": {
"type": "string"
},
"from_provider": {
"type": "string"
},
"to_description": {
"type": "string"
},
"allow_new_values": {
"type": "boolean",
"description": "Create accounts/providers/tickers not yet in reference-data. Default false."
},
"from_description": {
"type": "string"
},
"overall_eur_value": {
"type": "number",
"example": 1000,
"description": "The trade's total value in the ledger's base currency (the field name is historical: EUR was the only base)"
}
}
}