PERSONAL FINANCE / AGENT INFRASTRUCTURECANADA + UNITED STATES

The personal finance backend for your agent.

One accurate model of your household’s money.
Kept current in the background. Ready for your next tool call.

Bank connections, ownership, investments, and income. Behind 32 MCP tools, with access you control.

Create your household

Private preview · Free during the preview
No price is set.

CONNECT TO SIGHTLINEMCP / HTTP
Terminal
claude mcp add --transport http sightline https://my.sightlineapp.com/mcp

Paste in your terminal. Approve access in your browser.

THEN The client opens Sightline approval in your browser. Sign in or sign up. Create a household. Select access (Read only is first). Approve. Your agent reads get_started_with_sightline.

32 tools / 19 read · 13 writeOAuth 2.1 + PKCENo SDK requiredAgent-readable guide ↗

The interface is the protocol

Real tools.
Inspectable answers.

Your agent calls a tool. Sightline returns values, dates, scope, and the limits of the answer. The same contract serves an agent, a web app, or a script.

get_net_worth

Read a current total

The request needs no arguments. The result gives the total with its date, its scope, and its limits: complete, stale_accounts, and missing. Read them before a calculation.

Request · get_net_worth
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "get_net_worth",
    "arguments": {}
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "isError": false,
    "structuredContent": {
      "as_of": "2026-11-14",
      "currency": "CAD",
      "net_worth": "1304821.24",
      "assets": "1719731.64",
      "liabilities": "414910.40",
      "is_full_household": true,
      "complete": true,
      "stale_accounts": [],
      "missing": [],
      "scope": {
        "entities": "all",
        "account_types": "all",
        "detail": "full",
        "access": "read"
      },
      "history": [],
      "estimated_holdings": [],
      "estimated_count": 0,
      "derived_count": 0,
      "filters": {
        "as_of": null,
        "from": null,
        "to": null,
        "interval": "day",
        "include_entities": false,
        "include_components": false,
        "limit": 100,
        "cursor": null,
        "tax_entity_ids": null,
        "tax_entity_id": null,
        "account_types": null,
        "asset_groups": null
      },
      "not_started_count": 0,
      "entities": [
        {
          "tax_entity_id": "ent_4dcb0b7902a940e4a1f53ad0d8d8acb7",
          "type": "person",
          "direct": {
            "amount": "1304821.24",
            "currency": "CAD"
          },
          "direct_in_household_currency": "1304821.24",
          "household_fraction": "1",
          "household_part": "1304821.24",
          "notes": []
        }
      ],
      "accounts": [
        {
          "account_id": "acct_10dbf3599a5e4300b1e133da15f90c0f",
          "valuation_mode": "holdings",
          "value": {
            "amount": "97420.00",
            "currency": "CAD",
            "as_of": "2026-11-14",
            "source": "holdings",
            "stale": false
          },
          "total": null,
          "holdings_value": "97420.00",
          "unclassified": null,
          "difference": null,
          "notes": []
        }
      ],
      "excluded_entities": [],
      "excluded_unclassified": [],
      "notes": [],
      "components": [],
      "next_cursor": null,
      "recalculation_pending": false
    }
  }
}
get_net_worth · history

Read daily history

Use from and to together. The maximum is 366 inclusive days. Each row has the totals of that day and the counts of stale, missing, and estimated values.

Request · get_net_worth
{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "get_net_worth",
    "arguments": {
      "from": "2026-11-09",
      "to": "2026-11-13",
      "interval": "day"
    }
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 5,
  "result": {
    "isError": false,
    "structuredContent": {
      "as_of": null,
      "currency": "CAD",
      "net_worth": null,
      "assets": null,
      "liabilities": null,
      "is_full_household": true,
      "complete": true,
      "stale_accounts": [],
      "missing": [],
      "scope": {
        "entities": "all",
        "account_types": "all",
        "detail": "full",
        "access": "read"
      },
      "history": [
        {
          "estimated_count": 0,
          "derived_count": 0,
          "as_of": "2026-11-09",
          "net_worth": "1300990.15",
          "assets": "1715900.55",
          "liabilities": "414910.40",
          "complete": true,
          "stale_count": 0,
          "missing_count": 0,
          "not_started_count": 0
        },
        {
          "estimated_count": 0,
          "derived_count": 0,
          "as_of": "2026-11-10",
          "net_worth": "1301167.80",
          "assets": "1716078.20",
          "liabilities": "414910.40",
          "complete": true,
          "stale_count": 0,
          "missing_count": 0,
          "not_started_count": 0
        },
        {
          "estimated_count": 0,
          "derived_count": 0,
          "as_of": "2026-11-11",
          "net_worth": "1302136.15",
          "assets": "1717046.55",
          "liabilities": "414910.40",
          "complete": true,
          "stale_count": 0,
          "missing_count": 0,
          "not_started_count": 0
        },
        {
          "estimated_count": 0,
          "derived_count": 0,
          "as_of": "2026-11-12",
          "net_worth": "1302853.50",
          "assets": "1717763.90",
          "liabilities": "414910.40",
          "complete": true,
          "stale_count": 0,
          "missing_count": 0,
          "not_started_count": 0
        },
        {
          "estimated_count": 0,
          "derived_count": 0,
          "as_of": "2026-11-13",
          "net_worth": "1304821.24",
          "assets": "1719731.64",
          "liabilities": "414910.40",
          "complete": true,
          "stale_count": 0,
          "missing_count": 0,
          "not_started_count": 0
        }
      ],
      "estimated_holdings": [],
      "estimated_count": 0,
      "derived_count": 0,
      "filters": {
        "as_of": null,
        "from": "2026-11-09",
        "to": "2026-11-13",
        "interval": "day",
        "include_entities": false,
        "include_components": false,
        "limit": 100,
        "cursor": null,
        "tax_entity_ids": null,
        "tax_entity_id": null,
        "account_types": null,
        "asset_groups": null
      },
      "not_started_count": 0,
      "entities": [],
      "accounts": [],
      "excluded_entities": [],
      "excluded_unclassified": [],
      "notes": [],
      "components": [],
      "next_cursor": null,
      "recalculation_pending": false
    }
  }
}
list_holdings

Read holdings and prices

Each holding has a quantity, a price with its date and source, and a value. The account states its valuation mode, and the result states its scope and completeness.

Request · list_holdings
{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "list_holdings",
    "arguments": {
      "as_of": "2026-11-13"
    }
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 6,
  "result": {
    "isError": false,
    "structuredContent": {
      "accounts": [
        {
          "account_id": "acct_10dbf3599a5e4300b1e133da15f90c0f",
          "valuation_mode": "holdings",
          "total": null,
          "holdings_value": "97420.00",
          "unclassified": null,
          "difference": null,
          "holdings": [
            {
              "recorded": {
                "account_holding_id": "hold_10e3c458f18e4cf5af030099ad82eaf2",
                "as_of": "2026-11-09",
                "quantity": "5000.00"
              },
              "price_source": "market",
              "instrument_id": "inst_87582f0086b14560847745850f66850f",
              "symbol": "CASH:CAD",
              "quantity": "5000.00",
              "price": {
                "amount": "1",
                "currency": "CAD",
                "as_of": "2026-11-13",
                "source": "identity"
              },
              "value": "5000.00",
              "stale": false,
              "rate": "1",
              "rate_date": "2026-11-13",
              "reason": null,
              "asset_group": "cash"
            },
            {
              "recorded": {
                "account_holding_id": "hold_6c080125ca354216b64c82c8cf87ddff",
                "as_of": "2026-11-09",
                "quantity": "340"
              },
              "price_source": "market",
              "instrument_id": "inst_92607e437c9f4fb79cb705cc99bf8379",
              "symbol": "VFV.TO",
              "quantity": "340",
              "price": {
                "amount": "151.40",
                "currency": "CAD",
                "as_of": "2026-11-13",
                "source": "demo"
              },
              "value": "51476.00",
              "stale": false,
              "rate": "1",
              "rate_date": "2026-11-13",
              "reason": null,
              "asset_group": "public"
            },
            {
              "recorded": {
                "account_holding_id": "hold_68ee805db20f4537a8b7fb89fa205776",
                "as_of": "2026-11-09",
                "quantity": "1200"
              },
              "price_source": "market",
              "instrument_id": "inst_baec19abcddf4ba087964e6642ce8c8f",
              "symbol": "XEQT.TO",
              "quantity": "1200",
              "price": {
                "amount": "34.12",
                "currency": "CAD",
                "as_of": "2026-11-13",
                "source": "demo"
              },
              "value": "40944.00",
              "stale": false,
              "rate": "1",
              "rate_date": "2026-11-13",
              "reason": null,
              "asset_group": "public"
            }
          ],
          "notes": []
        }
      ],
      "estimated_holdings": [],
      "next_cursor": null,
      "scope": {
        "entities": "all",
        "account_types": "all",
        "detail": "full",
        "access": "read"
      },
      "is_full_household": true,
      "complete": true,
      "stale_accounts": [],
      "missing": []
    }
  }
}
create_transactions

Write a batch with a transfer pair

The shared transfer_key joins the two new transfer rows. One atomic write accepts up to 200 rows. The result returns each stored row. The two transfer rows share a transfer_id.

Request · create_transactions
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "create_transactions",
    "arguments": {
      "transactions": [
        {
          "account_id": "acct_66ce0bea4b7e41b8b7e340fbeb1914b5",
          "date": "2026-11-13",
          "amount": "-86.40",
          "currency": "CAD",
          "type": "expense",
          "category": "groceries",
          "merchant": "Corner Market",
          "external_id": "chq-2026-11-13-001"
        },
        {
          "account_id": "acct_66ce0bea4b7e41b8b7e340fbeb1914b5",
          "date": "2026-11-13",
          "amount": "-500.00",
          "currency": "CAD",
          "type": "transfer",
          "transfer_key": "to-savings",
          "external_id": "chq-2026-11-13-002"
        },
        {
          "account_id": "acct_b581a6bd50c94294a73d22264e63efb0",
          "date": "2026-11-13",
          "amount": "500.00",
          "currency": "CAD",
          "type": "transfer",
          "transfer_key": "to-savings",
          "external_id": "sav-2026-11-13-001"
        }
      ]
    }
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "isError": false,
    "structuredContent": {
      "transactions": [
        {
          "id": "txn_e683f613d86c47558cd8ab28a09f5f37",
          "account_id": "acct_66ce0bea4b7e41b8b7e340fbeb1914b5",
          "tax_entity_id": null,
          "external_id": "chq-2026-11-13-001",
          "date": "2026-11-13",
          "amount": "-86.40",
          "currency": "CAD",
          "type": "expense",
          "pending": false,
          "excluded": false,
          "category": "groceries",
          "income_type": null,
          "income_source_id": null,
          "transfer_id": null,
          "description": null,
          "merchant": "Corner Market",
          "instrument_id": null,
          "quantity": null,
          "unit_price": null,
          "cost_basis": null,
          "source": "agent",
          "created_at": "2026-11-14T13:44:26.318434-05:00",
          "updated_at": "2026-11-14T13:44:26.318434-05:00",
          "other_account_ids": []
        },
        {
          "id": "txn_8a0884242fd142ea9063ad12abc05f98",
          "account_id": "acct_66ce0bea4b7e41b8b7e340fbeb1914b5",
          "tax_entity_id": null,
          "external_id": "chq-2026-11-13-002",
          "date": "2026-11-13",
          "amount": "-500.00",
          "currency": "CAD",
          "type": "transfer",
          "pending": false,
          "excluded": false,
          "category": null,
          "income_type": null,
          "income_source_id": null,
          "transfer_id": "xfer_9279c3b223424d05b2d0678439fda8d3",
          "description": null,
          "merchant": null,
          "instrument_id": null,
          "quantity": null,
          "unit_price": null,
          "cost_basis": null,
          "source": "agent",
          "created_at": "2026-11-14T13:44:26.318434-05:00",
          "updated_at": "2026-11-14T13:44:26.318434-05:00",
          "other_account_ids": [
            "acct_b581a6bd50c94294a73d22264e63efb0"
          ]
        },
        {
          "id": "txn_e16c9176fb5c48fe89dd233428563db5",
          "account_id": "acct_b581a6bd50c94294a73d22264e63efb0",
          "tax_entity_id": null,
          "external_id": "sav-2026-11-13-001",
          "date": "2026-11-13",
          "amount": "500.00",
          "currency": "CAD",
          "type": "transfer",
          "pending": false,
          "excluded": false,
          "category": null,
          "income_type": null,
          "income_source_id": null,
          "transfer_id": "xfer_9279c3b223424d05b2d0678439fda8d3",
          "description": null,
          "merchant": null,
          "instrument_id": null,
          "quantity": null,
          "unit_price": null,
          "cost_basis": null,
          "source": "agent",
          "created_at": "2026-11-14T13:44:26.318434-05:00",
          "updated_at": "2026-11-14T13:44:26.318434-05:00",
          "other_account_ids": [
            "acct_66ce0bea4b7e41b8b7e340fbeb1914b5"
          ]
        }
      ],
      "next_cursor": null
    }
  }
}
record_holding

Record an end-of-day quantity

A recorded quantity is a state, not a trade. Use cash_currency instead of instrument_id for cash. For repeated writes, add a stable external_id and repeat the same content.

Request · record_holding
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "record_holding",
    "arguments": {
      "account_id": "acct_10dbf3599a5e4300b1e133da15f90c0f",
      "instrument_id": "inst_92607e437c9f4fb79cb705cc99bf8379",
      "quantity": "340",
      "as_of": "2026-11-09",
      "cost_basis": "44200.00",
      "external_id": "brokerage-vfv-opening"
    }
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": false,
    "structuredContent": {
      "id": "hold_6c080125ca354216b64c82c8cf87ddff",
      "account_id": "acct_10dbf3599a5e4300b1e133da15f90c0f",
      "instrument_id": "inst_92607e437c9f4fb79cb705cc99bf8379",
      "as_of": "2026-11-09",
      "quantity": "340",
      "cost_basis": "44200.00",
      "source": "agent",
      "observed_at": "2026-11-14T13:44:26.303745-05:00",
      "external_id": "brokerage-vfv-opening"
    }
  }
}
get_started_with_sightline

Read the household and grant first

The first call of an agent. It returns the setup skill, the household state, and the scope of the grant. Follow the skill before account setup.

Request · get_started_with_sightline
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "get_started_with_sightline",
    "arguments": {}
  }
}
Result · demo household
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "isError": false,
    "structuredContent": {
      "household": {
        "id": "hh_94ca7dd7b76845f1aa785bd54b2db3a1",
        "currency": "CAD",
        "tax_entities": 1,
        "accounts": 7,
        "bank_connections": 0,
        "as_of": "2026-11-14",
        "stale_accounts": [],
        "missing": []
      },
      "grant": {
        "entities": "all",
        "account_types": "all",
        "detail": "full",
        "access": "read"
      },
      "simple_path": [
        "get_started_with_sightline",
        "get_household",
        "list_accounts",
        "create_account",
        "record_account_value",
        "get_net_worth"
      ],
      "skill": {
        "name": "get_started_with_sightline",
        "version": "1.4.3",
        "text": "(shortened here: the setup guide for the agent, 231 lines of Markdown)"
      }
    }
  }
}

Decimal strings. Dated values. Explicit scope and completeness.

Inspect holdings, transfer pairs, history & setup →

A household is a graph

Model the money.
And who owns it.

From one bank account to a family with a holding company. People, corporations, trusts, and dated ownership share one model.

Explore the model & all 32 tools →

Things → states → flows.
Expectations → reports.

Accounts and entities are things. Values and holdings are dated states. Transactions are flows. Expected income and reported income stay distinct.

Plaid connections

Chequing and savings, credit cards, lines of credit, loans, and mortgages. Imports every six hours and on each bank webhook.

Market data

Daily closes for public instruments and indexes. Daily exchange rates. Daily net worth with history.

Investments

Your agent or you record trades, holdings, or one account total. Public market data supplies prices.

Any agent. Deliberate access.

Your household.
Each client’s own grant.

Use ChatGPT, Claude Code, Codex, Cursor, Claude, or another MCP client. You approve what each one can read and write.

Sightline permission presets
PresetRecords & detailPermissionTools
Full accessAll entities and account types. Full detail.write32
Read only INITIAL SELECTIONAll entities and account types. Full detail.read19
Cash and credit balancesCash, credit cards, and lines of credit. Balances only.read14
One tax entityOne selected entity. Full detail.read or write19 or 32
CustomEntities, account types, balances or full detail.read or writeBy scope

Each preset stays within the human member’s own access. Write access includes reads. Balances detail includes holdings. Full detail also permits transactions, income, and relationships.

Your ChatGPTFull access

Read the household. Record a value or transaction with your approval.

Your accountant’s agentOne tax entity · Read

Read one corporation’s full detail. Keep other entities outside the grant.

Your budgeting botCash and credit balances

Read cash, card, and line of credit balances. No transaction detail.

The human stays in control

Read only is the first selection.

Check the client and redirect host. Select the household and access. Approve on the control page.

A restricted total covers only permitted records and says so. Revoke a grant to stop its next request.

Connection steps & permission details →
Agent approvalEXAMPLE

Example web app

Redirect host or scheme:
sightline-example-web.up.railway.app

Check the redirect host or scheme. A client can choose its own name.

HouseholdDemo household

All entities · All account types · Full detail · Read only

This example grants no access to Sightline.

Financial facts without identity fields

No PII
in the database.

Financial records remain sensitive.
Less identity data means less to disclose.

Read the security facts →
IDENTITY → SIGN-IN PROVIDER

No names, email addresses, street addresses, telephone numbers, birth dates, government IDs, or account numbers in the Sightline database. It holds opaque IDs.

TEXT → FILTER

A text filter rejects account numbers, email addresses, and telephone numbers in agent-written text. Financial detail can still identify a person.

REQUEST → ONE HOUSEHOLD

Row-level security checks a signed household context in the database itself. Bank access tokens are encrypted.

LOGS → IDS AND CODES

No amounts, text fields, tokens, or provider payloads in logs. Two independent security reviews found 18 points. Each point that needed code is corrected.

Vibe code your own interface

Your web app.
Your mobile app.
The same backend.

Paste this into your coding agent. An app is an OAuth public client with PKCE, exactly as an agent is. It calls the same 32 tools.

Sightline calculates valuations, currency conversion, and daily net worth. Your agent or app calculates returns, taxes, budgets, and other results.

Build on the public protocol →
Starter prompt · paste into your coding agent
Build me a net worth dashboard on Sightline. Read https://www.sightlineapp.com/llms-full.txt first. Use OAuth with PKCE and the public MCP tools at https://my.sightlineapp.com/mcp. Ask for read-only access. Read get_started_with_sightline first. Show net worth history, account balances, and holdings. Preserve decimal strings. Show the scope, dates, missing values, stale data, and estimates. Label a restricted total as a subtotal. Keep browser tokens in memory and out of URLs and logs. Calculate returns in the app.
llms-full.txt Complete app guide ↗llms.txt Short index ↗

No SDK. No separate API. No helper endpoint.

Three clients. One public contract.

We build on it, too.

The web app, native iPhone app, and CLI all use the public tools. Each one proves that your interface can be your own.

BROWSER / PUBLIC CLIENT
Your web app↓ OAuth + PKCESightline /mcp↓ tools/callYour household model
Web

A browser. Your view.

The example web app uses the public tools. Its interface and calculations live in the app.

Open the web app ↗
Sightline iPhone example with Avery family demo dataNATIVE iPHONE / DEMO DATA
iPhone

Native, from the same facts.

A native iPhone app on the same 32 tools. The picture shows the demo household.

Open TestFlight ↗
TERMINAL / PUBLIC CLIENT
$ sightline net-worth
$ sightline accounts list
$ sightline holdings list
$ sightline transactions list
$ sightline mcp serve
Your grant. Your terminal.
CLI

Make the facts scriptable.

A command-line client and local MCP bridge. Browser approval. No configuration necessary.

Install the CLI →

Your next tool call

Give your agent
a financial memory.

Private preview. Free during the preview.
No price is set. One household uses Sightline today.

CONNECT TO SIGHTLINEMCP / HTTP
Terminal
claude mcp add --transport http sightline https://my.sightlineapp.com/mcp

Paste in your terminal. Approve access in your browser.

THEN The client opens Sightline approval in your browser. Sign in or sign up. Create a household. Select access (Read only is first). Approve. Your agent reads get_started_with_sightline.