Import Portfolio Holdings
import_portfolioStore the structured holdings explicitly entered by the user in their FinBridge portfolio. Uploaded files, screenshots, chat history and extracted file content are not supported sources for this connector. Accepts listed stocks (KR/US/TW/JP) as well as cash, crypto (BTC etc.) and physical assets (gold): stocks are matched against the database, crypto and gold (PAXG) get live ccxt quotes, cash and physical assets are stored at the given value. For ETFs or foreign products not in the database, pass value directly. If the user specifies an asset class, pass asset_class as well (cash|bond|physical|growth|dividend|crypto|other; Korean labels 현금|채권|현물|성장주|배당주|가상자산|기타 are accepted). Registered listed stocks are also added to the watchlist automatically. Use when: the user explicitly enters what they hold and wants it stored for get_portfolio. There is no per-holding edit or delete tool: to change or remove holdings, re-import the complete corrected list with replace=true (replace=false only adds/updates the rows given). Not this tool for: the watchlist (manage_watchlist — companies followed, no quantities), valuing a company (get_valuation), or reading what is already stored (get_portfolio).
IMPORTANT — read the response before telling the user you are done:
Confirmation gate: if the user already has a stored portfolio, this call returns
preview:truewith achangesdiff (added/removed/changed) and does NOT save anything, unless you pass confirm=true. Show the diff to the user — call outchanges.removedespecially: if the submission was only part of their holdings, those positions will look fully sold. Only pass confirm=true after the user has seen and accepted the diff (skip this ifget_portfoliowas empty to begin with — there is nothing to compare against).Missing fields: each saved row reports
missing_fields(commonlyacquired_on, since brokerage statements rarely include it) and unresolved symbols appear inneeds_input— ambiguous names/codes listcandidates(do not guess one), unmatched symbols need a ticker/code or avalue. Rows with missing fields ARE saved (never block on incompleteness) — ask the user for the missing pieces and call this tool again for just those rows to fill them in.Cash: check the
cashfield. Ifstatusisnot_asked, the stored portfolio has no cash balance on file (this is different from a confirmed zero) — ask the user for their cash balance (amount or % of the portfolio) and its currency, then import it as one more holding:{symbol:'현금', value, currency, asset_class:'현금'}. Without it, equity weights in get_portfolio are overstated.Always show the user the per-row summary (name/qty/avg_price recognized) before treating the import as authoritative — a misread quantity produces a wrong return. If something was saved wrong, undo it with restore_portfolio_snapshot (defaults to the snapshot right before this one).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to apply after the user has reviewed the `changes` preview from a prior call with the same holdings/replace. Required whenever a portfolio already exists and this submission would change it; not needed for a first import into an empty portfolio. | |
| replace | No | true = wipe the existing portfolio (stocks + assets) and replace it; default false = merge | |
| holdings | Yes | Structured holdings entered by the user. Each item accepts exactly: symbol (required), qty, avg_price, return_pct, asset_class, currency, value, acquired_on, price_symbol, unit, price_scale. Other keys (e.g. quantity, cost, price, shares) are rejected with an error naming the key — map them to qty / avg_price / value before calling. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cash | No | ||
| error | No | ||
| notes | No | ||
| changes | No | ||
| preview | No | ||
| holdings | No | ||
| imported | No | ||
| snapshot | No | ||
| unmatched | No | ||
| needs_input | No |