Simulator Play ★ Learn Journal Calculator Blog Guides
Simulator Play ★ Learn Journal Calculator Blog Guides
Journal // AI agent guide

AI agent guide: the Passive Nomads journal over MCP

Connect an AI assistant to your journal at https://passivenomads.com/mcp and it can log, roll, close and price your options trades for you, always showing you the exact values first. This page is the full guide the AI reads before its first change (guide v2, 2026-10-15).

This guide is for an AI assistant (Claude, ChatGPT or your own agent) connected to a user's Passive Nomads options trade journal through MCP at https://passivenomads.com/mcp. Read it before your first write. The same text is available from the get_guide tool and the journal://guide resource.

a. Purpose and hard limits

b. Data model

c. Units

d. Opening a trade

Send, for each leg, everything you know about the moment it was opened:

The journal stores these as the leg's opening snapshot, so the user sees Greeks and extrinsic value immediately. Anything you leave out is calculated with Black-Scholes (r = 5%) when an underlying price is known, and shown with a calc tag:

Without an underlying price nothing can be calculated; the value shows "—".

e. Close vs delete

f. Banked and History

g. Rolls

Use roll_position for a roll: it closes the old leg at close_price and opens its replacement (new_strike, new_expiry, new_open_price, optional new_qty) in one call, linked to the old leg, so banked P&L stays on the same combo. Include the new leg's underlying_price, iv and Greeks if known. Do not record a roll as a separate close and add.

h. Syncing from a broker (e.g. IBKR through its own MCP)

  1. Call list_positions (open) to get the journal's open legs, with their leg_ids.
  2. Match broker positions to journal legs by ticker + right (call/put/stock) + strike + expiry + quantity.
  3. Reconcile:
    • a broker position with no journal match → add_position (new combo, ask the user for its name) or add_leg (if it belongs to an existing combo);
    • a journal leg that is gone at the broker with a fill → close_leg at the fill price;
    • a changed quantity → a partial close_leg (smaller) or add_leg (larger);
    • an expired option → close_leg with how: "expired".
  4. update_marks for every open leg: mark, underlying_price, iv and the four Greeks (per share), with source and as_of.
  5. update_portfolio once per day with the account snapshot.
  6. Show the user a summary of every change you intend to make and wait for approval before writing.

Never create duplicates: if a broker position could match more than one journal leg, or the combo grouping is unclear, ask the user.

i. Portfolio snapshots

update_portfolio stores one account snapshot per day (a second call on the same day replaces it):

Snapshots fill the Portfolio panel and the $ Value and % Return performance charts, which need at least 2 snapshots in the selected range. Without them the user still sees $ P&L (realised P&L from closed trades plus open P&L now). journal_summary returns the latest snapshot.

Backfilling history

When the user first connects, offer to load past account values so the charts have history right away:

  1. Ask the broker (e.g. the IBKR MCP) for daily net liquidation values over the period the user wants (e.g. since the first journal trade, or the last 12 months), plus deposits and withdrawals by day.
  2. Show the user the date range, the number of days and the first and last values, and wait for a yes.
  3. Send them in one call: update_portfolio { "source": "IBKR via Claude", "snapshots": [ { "snap_date": "2026-04-01", "net_liq": 171250 }, { "snap_date": "2026-04-02", "net_liq": 172010, "cash_flow": 5000 }, … ] } (up to 400 days per call; each call counts as one write toward the 60 per hour).
  4. Put each deposit (+) or withdrawal (−) in that day's cash_flow, so % Return is not distorted.

Days that already have a snapshot are replaced. Dates must not be in the future, and each day may appear only once per call. Afterwards, keep syncing one snapshot per day.

j. Errors and how to fix them

Error saysMeaningFix
send per-share option Greeks (e.g. delta −1…1), not position totalsA Greek was scaled by quantity or sign-flipped for a short legResend the broker's per-share value for the option itself
gamma … is negative / vega … is negativeSame mistake on a short legSend the unsigned per-share value
Rate limit reached: at most 60 journal changes per hourToo many writes this hour; nothing was savedWait, batch marks into one update_marks call, or let the user enter it on the website
No position/leg with id … in your journalWrong id (or not this user's)Call list_positions / get_position and use the returned ids
This leg is already closedClosing twiceRefresh with get_position
Give a close price for every open legclose_position without every open legInclude each open leg_id with its close_price
combo name … is requiredstrategy missing on add_positionAsk the user what to call the combo
options need a strike / expiry YYYY-MM-DDOption leg incompleteAdd the missing field
stock legs have no option GreeksGreeks sent for a stock legOmit them; stock delta is the share count
HTTP 401 session has expiredThe connection's token expired or was revokedThe user reconnects the connector
HTTP 403 not a guest sessionThe user is signed in as a guestThe user creates a free account and reconnects

k. Worked examples

1. A 3-leg combo: opened, rolled, closed

Open (after the user approves the values):

add_position {
  "ticker": "NVDA", "strategy": "Synthetic long + protective put", "opened_on": "2026-10-01",
  "legs": [
    { "instrument": "call", "side": "long",  "qty": 2, "strike": 175, "expiry": "2026-11-28", "open_price": 14.20,
      "underlying_price": 176.10, "iv": 41.2, "delta": 0.58, "gamma": 0.019, "theta": -0.12, "vega": 0.24, "source": "IBKR" },
    { "instrument": "put",  "side": "short", "qty": 2, "strike": 175, "expiry": "2026-11-28", "open_price": 11.60,
      "underlying_price": 176.10, "iv": 42.0, "delta": -0.44, "source": "IBKR" },
    { "instrument": "put",  "side": "long",  "qty": 2, "strike": 160, "expiry": "2026-11-28", "open_price": 4.10,
      "underlying_price": 176.10, "iv": 46.8, "source": "IBKR" }
  ]
}

Roll the short put down and out (closes the old leg, opens the new one, banks the difference on the combo):

roll_position { "leg_id": "<short 175 put>", "rolled_on": "2026-10-20", "close_price": 6.40,
  "new_strike": 170, "new_expiry": "2026-12-19", "new_open_price": 8.10,
  "underlying_price": 184.00, "iv": 39.0, "delta": -0.31, "source": "IBKR" }

Close the whole combo at the broker fills:

close_position { "position_id": "<combo>", "closed_on": "2026-11-14",
  "legs": [ { "leg_id": "<long 175 call>", "close_price": 21.30 },
            { "leg_id": "<short 170 put>",  "close_price": 1.20 },
            { "leg_id": "<long 160 put>",   "close_price": 0.15 } ] }

If NVDA has no other open combo, the whole run (including the roll's banked P&L) moves to History.

2. A full IBKR sync

  1. list_positions {} → the journal has NVDA 175C ×2 long, NVDA 160P ×2 long, AAPL 245C ×1 short + 100 AAPL shares.
  2. IBKR shows: NVDA 175C ×2, NVDA 160P ×1 (one sold at 2.35 today), AAPL 245C ×1 short, 100 AAPL, and a new MSFT 480C ×1 bought today at 46.50.
  3. Proposed changes, shown to the user:
    • close_leg { "leg_id": "<NVDA 160P>", "qty": 1, "close_price": 2.35 } (a partial close: banked on the NVDA combo);
    • add_position { "ticker": "MSFT", "strategy": "<ask the user>", "legs": [ { "instrument": "call", "side": "long", "qty": 1, "strike": 480, "expiry": "2026-12-18", "open_price": 46.50, "underlying_price": 505.00, "iv": 27.4, "delta": 0.68, "source": "IBKR" } ] };
    • one update_marks call with every open leg's mark, underlying_price, iv, delta, gamma, theta, vega, source: "IBKR" and as_of;
    • update_portfolio { "source": "IBKR via Claude", "net_liq": 184620, "excess_liquidity": 121350, "maint_margin": 58940, "init_margin": 70490, "equity_with_loan": 180290, "available_funds": 109800, "buying_power": 439200, "gross_position": 262150, "total_cash": 42780, "leverage": 1.42, "cash_flow": 0 }.
  4. The user says yes → make the calls → show the saved values and a one-line summary.

Set it up from your journal → Connect your AI. More: all guides.

Passive Nomads provides free educational content and simulation tools for learning about options. Nothing here is financial advice. Options trading involves risk, including the risk of loss. Simulated results do not represent real trading outcomes.