Maverick MCP 1.2.0 stops backtests from seeing the future

2 hours ago

Maverick MCP is the open-source stock market server that lets an AI assistant pull quotes, screen stocks, track a portfolio and run backtests. Version 1.2.0 corrects what its tools return for backtests, portfolios, quotes and research. If you run it in Docker, there is one step to take before you upgrade.

Ask about this presentation

Chapters

  1. 0:00Maverick MCP 1.2.0
  2. 0:21Backtests
  3. 0:46Portfolio
  4. 1:07Market data
  5. 1:27Research and analysis
  6. 1:49Also fixed
  7. 2:06Response changes
  8. 2:29Docker data moves to /data
  9. 2:53Install 1.2.0
Show transcript
  1. Maverick MCP is the open-source stock market server that lets an AI assistant pull quotes, screen stocks, track a portfolio and run backtests. Version 1.2.0 corrects what its tools return for backtests, portfolios, quotes and research. If you run it in Docker, there is one step to take before you upgrade.

    Slide text

    Maverick MCP 1.2.0 stops backtests from seeing the future

    Correct numbers in backtests, portfolios, quotes and research.

    53tools
    38core
    12backtesting
    3research
    wshobson/maverick-mcp · v1.2.0
  2. Backtests no longer see the future. Their inputs are causal, trade durations come from timestamps, and ATR position sizing is consistent. Metrics now annualize over 252 trading sessions instead of 365 days. So a fee-free 10 percent gain over 252 sessions now annualizes to 10 percent, where it used to read above 14.

    Slide text
    ~ $ fixes/backtesting

    Backtests no longer see the future

    • Causal inputs
    • Trade durations from timestamps
    • Consistent ATR sizing
    A fee-free 10% gain over 252 trading sessions, annualized
    1.1.0 >14%
    1.2.0 10%
    252 trading sessions a year, not 365 days
    wshobson/maverick-mcp · v1.2.0 · #310
  3. In portfolio tracking, two calls at once could lose a purchase the server had already acknowledged. Writes are now serialized, in SQLite and in PostgreSQL. Positions also round to the precision their columns store, eight places for shares and four for cost, so selling exactly what you bought closes the position.

    Slide text
    ~ $ fixes/portfolio

    A purchase the server acknowledged stays recorded

    Concurrent calls

    Each write is one serialized transaction.

    SQLite takes its write lock before reading positions. PostgreSQL locks the portfolio row.

    Stored precision

    Shares round to 8 places, cost to 4, half-up.

    Selling exactly what you bought closes the position.

    wshobson/maverick-mcp · v1.2.0 · #287 #310
  4. A quote with no usable price used to come back as success, with a price of zero. Now it is an error, and a dotted class share retries with a dash. Top gainers and losers are ranked by real percent change again. Stored price history refreshes once it is a day old, and never mixes bars adjusted on different bases.

    Slide text
    ~ $ fixes/market_data

    A quote with no usable price now returns an error

    No usable price error, instead of success with price 0
    Class shares BRK.B retries as BRK-B
    Market movers ranked by real percent change, with correct tickers
    Price history refreshes at 24 hours old, one adjustment basis
    wshobson/maverick-mcp · v1.2.0 · #299 #300 #310
  5. The analysis tools now report what they actually found. Research returns an insufficient evidence error when every source fails validation, where it used to synthesize an answer from nothing. Support and resistance are the observed extremes over the window you asked for, and risk confidence is reported as unavailable rather than invented.

    Slide text
    ~ $ fixes/research

    With no sources left, research returns an error

    insufficient_evidence when every source fails validation, instead of a synthesized answer
    Support and resistance the observed extremes over the stated window
    Risk confidence reported as unavailable
    wshobson/maverick-mcp · v1.2.0 · #310
  6. A cancelled or stale call can no longer leave a provider's circuit breaker stuck half-open until you restart. On a fresh install, screening explains how to add symbols. The trade journal takes an optional entry date, and a new read-only tool lists your watchlists.

    Slide text
    ~ $ fixes/misc

    Fixes you may have hit

    Circuit breaker A cancelled or stale call no longer leaves it stuck half-open until restart.
    Fresh install Screening with no symbols explains how to add them.
    Trade journal portfolio_journal_add_trade takes an optional entry_date.
    Watchlists New read-only portfolio_watchlist_list tool.
    wshobson/maverick-mcp · v1.2.0 · #273 #299 #310
  7. A client that read the old values will see different ones. Journal results keep the trade's open or closed state in trade status, and status stays the call's success or error. A profit factor with no losing trades is null, with a status field, instead of zero. Equity and drawdown curves come back as 60 points, and portfolio backtests list the symbols that failed.

    Slide text
    ~ $ upgrade/responses

    Clients that read these fields will see new values

    trade_status Journal add, close and review put open or closed here. status stays success or error.
    profit_factor null with a status field when there are no losing trades, instead of 0
    equity_curve
    drawdown_series
    60 evenly spaced points; trade lists bounded, with omission counts
    failed New in backtest_portfolio and compare_strategies: the symbols that failed
    wshobson/maverick-mcp · v1.2.0 · #299 #310 #318
  8. The 1.1.0 image kept its databases under /app. The 1.2.0 image keeps them under /data. Back up the old files before you replace the container, then mount a named volume at /data. If your old setup used POSTGRES_URL, rename it to DATABASE_URL. The image also shrank from about 2.3 gigabytes to 1.2.

    Slide text
    ~ $ upgrade/docker

    Docker users: back up /app before you replace the container

    1.1.0 /app/maverick.db · /app/maverick_cache.db 1.2.0 /data/maverick.db · /data/maverick_cache.db
    $ docker run ... --mount source=maverick-data,target=/data ...

    Using POSTGRES_URL? Rename it to DATABASE_URL. The image is now 1.2 GB, down from 2.27 GB.

    wshobson/maverick-mcp · v1.2.0 · #286 #310
  9. To upgrade, run the release tag straight from GitHub with uvx, or run the image from the GitHub container registry. Skip PyPI for now. That name still belongs to an unrelated project while a transfer request is open. Either way, you get backtests that no longer see the future.

    Slide text
    ~ $ upgrade/install

    Install from the release tag or the image

    $ uvx --from "git+https://github.com/wshobson/maverick-mcp@v1.2.0" \ maverick-mcp --transport stdio
    $ docker run --rm -p 127.0.0.1:8003:8000 \ --mount source=maverick-data,target=/data \ ghcr.io/wshobson/maverick-mcp:1.2.0

    Not from PyPI yet: the name maverick-mcp-server belongs to an unrelated project while a PEP 541 transfer request is open.

    wshobson/maverick-mcp · v1.2.0 · github.com/wshobson/maverick-mcp/releases/tag/v1.2.0

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️