webull-openapi-mcp 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.github/workflows/pypi-ci.yml +5 -9
  2. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/PKG-INFO +49 -43
  3. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/README.md +46 -40
  4. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/pyproject.toml +2 -2
  5. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/server.json +2 -2
  6. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_server.py +18 -50
  7. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_sdk_client.py +8 -8
  8. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/__init__.py +1 -1
  9. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/region_config.py +12 -4
  10. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/server.py +4 -0
  11. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/__init__.py +2 -0
  12. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/__init__.py +2 -0
  13. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/financial.py +1 -1
  14. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/fundamental.py +1 -1
  15. webull_openapi_mcp-1.2.2/webull_openapi_mcp/tools/market_data/option.py +221 -0
  16. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/screener.py +1 -1
  17. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/futures_order.py +74 -1
  18. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/instrument.py +83 -3
  19. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.env.example +0 -0
  20. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.gitignore +0 -0
  21. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/DISCLAIMER.md +0 -0
  22. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/LICENSE +0 -0
  23. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/.mcpbignore +0 -0
  24. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/build.sh +0 -0
  25. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/build_manifest.py +0 -0
  26. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/src/server.py +0 -0
  27. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/__init__.py +0 -0
  28. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_account_tools.py +0 -0
  29. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_audit.py +0 -0
  30. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_cli.py +0 -0
  31. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_config.py +0 -0
  32. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_errors.py +0 -0
  33. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_formatters.py +0 -0
  34. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_fundamental_screener_registration.py +0 -0
  35. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_fundamental_tools.py +0 -0
  36. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_guards.py +0 -0
  37. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_instrument_tools.py +0 -0
  38. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_market_data_tools.py +0 -0
  39. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_audit.py +0 -0
  40. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_config.py +0 -0
  41. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_formatters.py +0 -0
  42. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_guards.py +0 -0
  43. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_sdk.py +0 -0
  44. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_screener_tools.py +0 -0
  45. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_stock_order_tools.py +0 -0
  46. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/__main__.py +0 -0
  47. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/audit.py +0 -0
  48. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/cli.py +0 -0
  49. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/config.py +0 -0
  50. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/constants.py +0 -0
  51. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/errors.py +0 -0
  52. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/formatters.py +0 -0
  53. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/guards.py +0 -0
  54. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/sdk_client.py +0 -0
  55. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/crypto.py +0 -0
  56. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/event.py +0 -0
  57. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/futures.py +0 -0
  58. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/stock.py +0 -0
  59. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/watchlist.py +0 -0
  60. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/__init__.py +0 -0
  61. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/account.py +0 -0
  62. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/assets.py +0 -0
  63. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/crypto_order.py +0 -0
  64. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/event_order.py +0 -0
  65. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/option_order.py +0 -0
  66. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/order.py +0 -0
  67. {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/stock_order.py +0 -0
@@ -22,8 +22,8 @@ env:
22
22
 
23
23
  jobs:
24
24
  # ---------------------------------------------------------------------------
25
- # 1) Verify: single source of truth for the version, tests, build, artifact
26
- # checks and a real wheel smoke test. Nothing is published here.
25
+ # 1) Verify: single source of truth for the version, build, artifact checks
26
+ # and a real wheel smoke test. Nothing is published here.
27
27
  # ---------------------------------------------------------------------------
28
28
  verify:
29
29
  runs-on: ubuntu-latest
@@ -55,14 +55,10 @@ jobs:
55
55
  echo "Manual run; building pyproject version: $VERSION"
56
56
  fi
57
57
 
58
- - name: Install package (with dev deps) and build tooling
58
+ - name: Install build tooling
59
59
  run: |
60
60
  python -m pip install --upgrade pip
61
- pip install build hatchling twine
62
- pip install -e ".[dev]"
63
-
64
- - name: Run tests
65
- run: pytest -q
61
+ pip install build twine
66
62
 
67
63
  - name: Build package
68
64
  run: python -m build
@@ -104,7 +100,7 @@ jobs:
104
100
  path: dist/
105
101
 
106
102
  - name: Publish package to PyPI
107
- uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
103
+ uses: pypa/gh-action-pypi-publish@release/v1
108
104
  with:
109
105
  user: __token__
110
106
  password: ${{ secrets.PYPI_API_TOKEN }}
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: webull-openapi-mcp
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: MCP Server for Webull OpenAPI - enables AI assistants to securely access Webull trading and market data
5
5
  Project-URL: Homepage, https://github.com/webull-inc/webull-openapi-mcp
6
6
  Project-URL: Repository, https://github.com/webull-inc/webull-openapi-mcp
@@ -20,7 +20,7 @@ Requires-Python: <3.13,>=3.10
20
20
  Requires-Dist: click
21
21
  Requires-Dist: fastmcp==3.0.2
22
22
  Requires-Dist: python-dotenv
23
- Requires-Dist: webull-openapi-python-sdk==2.0.12
23
+ Requires-Dist: webull-openapi-python-sdk==2.0.17
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: hypothesis; extra == 'dev'
26
26
  Requires-Dist: pytest; extra == 'dev'
@@ -50,13 +50,13 @@ See [DISCLAIMER.md](DISCLAIMER.md) for the full disclaimer.
50
50
  ## Features
51
51
 
52
52
  - **Multi-Region Support** — US, HK, JP, SG, TH, MY, UK, MX, BR, EU, ZA, and AU regions with region-specific order types, trading sessions, and validation
53
- - **Market Data** — Real-time snapshots, tick data, quotes (depth), footprint, and OHLCV bars for stocks, futures, crypto, and event contracts
53
+ - **Market Data** — Real-time snapshots, tick data, quotes (depth), footprint, and OHLCV bars for stocks, options, futures, crypto, and event contracts
54
54
  - **NOII Data** — Net Order Imbalance Indicator bars and snapshots for US stock opening/closing auctions
55
55
  - **Screener** — Top gainers/losers, most active, market sectors, high dividend, and 52-week high/low rankings
56
56
  - **Watchlist** — Create, manage, and query user watchlists and instruments
57
57
  - **Fundamental Data** — Company profiles, analyst ratings, and target prices
58
- - **Stock & Fund Fundamentals** — Capital flow, SEC filings, earnings/dividend calendar, forecast EPS, industry comparison, and full fund data (rating, performance, allocation, holdings, brief, dividends, splits, net value, files) (US/HK/JP only)
59
- - **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow (US/HK/JP only)
58
+ - **Stock & Fund Fundamentals** — Capital flow, SEC filings, earnings/dividend calendar, forecast EPS, industry comparison, and full fund data (rating, performance, allocation, holdings, brief, dividends, splits, net value, files)
59
+ - **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow
60
60
  - **Trading** — Place, modify, cancel orders for stocks, options, futures, crypto, and event contracts
61
61
  - **Combo Orders** — OTO, OCO, OTOCO combo orders (US only)
62
62
  - **Option Strategies** — Multi-leg option strategies: vertical, straddle, strangle, butterfly, condor, etc. (US only)
@@ -122,6 +122,12 @@ Here are some prompts you can use with your AI assistant:
122
122
  - Buy 1 AAPL call option, strike $250, expiring 2026-04-17, limit price $5.00
123
123
  - Buy 1 TSLA put option, strike $200, expiring 2026-05-15
124
124
 
125
+ **Option Market Data**
126
+ - Get a snapshot for AAPL260522C00300000
127
+ - Show me tick data for TSLA251219C00450000
128
+ - Get daily bars for AAPL260522C00300000
129
+ - List available option contracts for AAPL expiring after 2026-06-01
130
+
125
131
  **Order Management**
126
132
  - Show me my order history for the last 7 days
127
133
  - What are my current open orders?
@@ -326,25 +332,25 @@ See [.env.example](.env.example) for full configuration template.
326
332
 
327
333
  ### Market Data
328
334
 
329
- | Category | Tools | Region |
330
- |----------|-------|--------|
331
- | **Stock** | `get_stock_tick`, `get_stock_snapshot`, `get_stock_quotes`, `get_stock_footprint`, `get_stock_bars`, `get_stock_bars_single`, `get_stock_noii_bars`, `get_stock_noii_snapshot` | All |
332
- | **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint` | US, HK |
333
- | **Crypto** | `get_crypto_snapshot`, `get_crypto_bars` | US |
334
- | **Event** | `get_event_tick`, `get_event_snapshot`, `get_event_depth`, `get_event_bars` | US |
335
- | **Screener** | `get_gainers_losers`, `get_most_active` | All |
336
- | **Screener (Sectors/Dividend/52W)** | `get_market_sectors`, `get_market_sectors_detail`, `get_high_dividend`, `get_52_week_high_low` | US, HK, JP |
335
+ | Category | Tools | Region |
336
+ |----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------|
337
+ | **Stock** | `get_stock_tick`, `get_stock_snapshot`, `get_stock_quotes`, `get_stock_footprint`, `get_stock_bars`, `get_stock_bars_single`, `get_stock_noii_bars`, `get_stock_noii_snapshot` | All |
338
+ | **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint` | US, HK |
339
+ | **Crypto** | `get_crypto_snapshot`, `get_crypto_bars` | US |
340
+ | **Option** | `get_option_tick`, `get_option_snapshot`, `get_option_bars` | US, HK, JP |
341
+ | **Event** | `get_event_tick`, `get_event_snapshot`, `get_event_depth`, `get_event_bars` | US |
342
+ | **Screener** | `get_gainers_losers`, `get_most_active`, `get_market_sectors`, `get_market_sectors_detail`, `get_high_dividend`, `get_52_week_high_low` | All |
337
343
  | **Watchlist** | `get_watchlists`, `create_watchlist`, `update_watchlist`, `delete_watchlist`, `get_watchlist_instruments`, `add_watchlist_instruments`, `remove_watchlist_instruments`, `update_watchlist_instruments` | All |
338
344
 
339
345
  ### Fundamental & Instrument
340
346
 
341
347
  | Category | Tools | Region |
342
348
  |----------|-------|--------|
343
- | **Instrument** | `get_instruments`, `get_futures_instruments`, `get_futures_products`, `get_crypto_instruments`, `get_event_series`, `get_event_instruments`, `get_event_categories`, `get_event_events` | varies |
349
+ | **Instrument** | `get_instruments`, `get_option_contracts`, `get_futures_instruments`, `get_futures_products`, `get_crypto_instruments`, `get_event_series`, `get_event_instruments`, `get_event_categories`, `get_event_events` | varies |
344
350
  | **Fundamental** | `get_company_profile`, `get_analyst_rating`, `get_analyst_target_price` | All |
345
- | **Stock Fundamentals** | `get_stock_capital_flow`, `get_stock_filings`, `get_stock_earnings_calendar`, `get_stock_dividend_calendar`, `get_stock_forecast_eps`, `get_stock_industry_comparison` | US, HK, JP |
346
- | **Fund Fundamentals** | `get_fund_rating`, `get_fund_performance`, `get_fund_allocation`, `get_fund_holdings`, `get_fund_brief`, `get_fund_dividends`, `get_fund_splits`, `get_fund_net_value`, `get_fund_files` | US, HK, JP |
347
- | **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` | US, HK, JP |
351
+ | **Stock Fundamentals** | `get_stock_capital_flow`, `get_stock_filings`, `get_stock_earnings_calendar`, `get_stock_dividend_calendar`, `get_stock_forecast_eps`, `get_stock_industry_comparison` | All |
352
+ | **Fund Fundamentals** | `get_fund_rating`, `get_fund_performance`, `get_fund_allocation`, `get_fund_holdings`, `get_fund_brief`, `get_fund_dividends`, `get_fund_splits`, `get_fund_net_value`, `get_fund_files` | All |
353
+ | **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` | All |
348
354
 
349
355
  ### Trading
350
356
 
@@ -364,31 +370,30 @@ See [.env.example](.env.example) for full configuration template.
364
370
 
365
371
  ### Region Differences
366
372
 
367
- | Feature | US | HK | JP | SG | TH | MY | UK | MX | BR | EU | ZA | AU |
368
- |---------|----|----|----|----|----|----|-----|----|----|----|----|-----|
369
- | Stock Trading | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
370
- | Option Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
371
- | Futures Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
372
- | Crypto Trading | Yes | No | No | No | No | No | No | No | No | No | No | No |
373
- | Event Contracts | Yes | No | No | No | No | No | No | No | No | No | No | No |
374
- | Combo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
375
- | Option Strategies | Yes | No | No | No | No | No | No | No | No | No | No | No |
376
- | Algo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
377
- | Screener (Gainers/Losers/Active) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
378
- | Screener (Sectors/Dividend/52W) | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
379
- | Watchlist | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
373
+ | Feature | US | HK | JP | SG | TH | MY | UK | MX | BR | EU | ZA | AU |
374
+ |-----------------------------|----|----|----|----|----|----|-----|----|----|----|----|-----|
375
+ | Stock Trading | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
376
+ | Option Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
377
+ | Futures Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
378
+ | Crypto Trading | Yes | No | No | No | No | No | No | No | No | No | No | No |
379
+ | Event Contracts | Yes | No | No | No | No | No | No | No | No | No | No | No |
380
+ | Combo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
381
+ | Option Strategies | Yes | No | No | No | No | No | No | No | No | No | No | No |
382
+ | Algo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
383
+ | Screener | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
384
+ | Watchlist | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
380
385
  | Fundamental (Company/Analyst) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
381
- | Stock/Fund Fundamentals | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
382
- | Financial Statements | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
383
- | NOII (Auction Imbalance) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
384
- | Markets | US | US, HK, CN | US, JP | US | US | US | US | US | US | US | US | US |
385
- | Instrument Categories | US_STOCK, US_ETF | US_STOCK, US_ETF, HK_STOCK, CN_STOCK | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF |
386
- | Order Types | LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT, TRAILING_STOP_LOSS, etc. | LIMIT, MARKET, ENHANCED_LIMIT, AT_AUCTION, AT_AUCTION_LIMIT, etc. | JP market: LIMIT, MARKET — US market: LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT |
387
- | Time-in-Force | DAY, GTC | US market: DAY, GTC, GTD — HK market: DAY, GTC — CN market: DAY | JP market: DAY — US market: DAY, GTC, GTD | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC |
388
- | Trading Sessions | ALL, CORE, NIGHT | CORE, ALL_DAY, NIGHT, ALL | CORE, ALL, NIGHT, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY |
389
- | JP Order Fields | — | — | `account_tax_type` required (GENERAL or SPECIFIC); `margin_type` (ONE_DAY or INDEFINITE) and `position_intent` optional margin-account-only fields; `close_contracts` optional | — | — | — | — | — | — | — | — | — |
390
-
391
- > **Note:** Screener (Gainers/Losers/Active), Fundamental (Company/Analyst), and NOII currently only support querying US stock data (`US_STOCK` category). Stock/Fund Fundamentals, Financial Statements, and the extended Screener (Sectors/Dividend/52W) are available in US, HK, and JP regions; supported `category` values vary by endpoint (commonly `US_STOCK`, `HK_STOCK`, `CN_STOCK`, `JP_STOCK`). Watchlist supports US stocks and HK stocks.
386
+ | Stock/Fund Fundamentals | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
387
+ | Financial Statements | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
388
+ | NOII (Auction Imbalance) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
389
+ | Markets | US | US, HK, CN | US, JP | US | US | US | US | US | US | US | US | US |
390
+ | Instrument Categories | US_STOCK, US_ETF | US_STOCK, US_ETF, HK_STOCK, CN_STOCK | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF |
391
+ | Order Types | LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT, TRAILING_STOP_LOSS, etc. | LIMIT, MARKET, ENHANCED_LIMIT, AT_AUCTION, AT_AUCTION_LIMIT, etc. | JP market: LIMIT, MARKET — US market: LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT |
392
+ | Time-in-Force | DAY, GTC | US market: DAY, GTC, GTD — HK market: DAY, GTC — CN market: DAY | JP market: DAY — US market: DAY, GTC, GTD | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC |
393
+ | Trading Sessions | ALL, CORE, NIGHT | CORE, ALL_DAY, NIGHT, ALL | CORE, ALL, NIGHT, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY |
394
+ | JP Order Fields | — | — | `account_tax_type` required (GENERAL or SPECIFIC); `margin_type` (ONE_DAY or INDEFINITE) and `position_intent` optional margin-account-only fields; `close_contracts` optional | — | — | — | — | — | — | — | — | — |
395
+
396
+ > **Note:** Screener (Gainers/Losers/Active), Fundamental (Company/Analyst), and NOII currently only support querying US stock data (`US_STOCK` category). Stock/Fund Fundamentals, Financial Statements, and the extended Screener (Sectors/Dividend/52W) are available in all regions; supported `category` values vary by endpoint (commonly `US_STOCK`, `HK_STOCK`, `CN_STOCK`, `JP_STOCK`). Watchlist supports US stocks and HK stocks.
392
397
 
393
398
  ---
394
399
 
@@ -433,7 +438,7 @@ All commands accept `--env-file PATH` to specify a custom `.env` file location (
433
438
  - **Review before trading** — Always review order details proposed by the AI before confirming. Use `preview_stock_order` / `preview_option_order` before placing orders.
434
439
  - **Use toolset filtering** — Set `WEBULL_TOOLSETS=account,market-data` to disable trading tools entirely if you only need read-only access. Valid toolsets: `account`, `market-data`, `trading`, `instrument`.
435
440
  - **Default sandbox** — The server defaults to UAT (sandbox) environment. You must explicitly set `WEBULL_ENVIRONMENT=prod` for live trading.
436
- - **Dependency security** — `fastmcp` is pinned to version `3.0.2` and `webull-openapi-python-sdk` is pinned to `2.0.12`. Users are responsible for monitoring and updating third-party dependencies for security patches. Review release notes before upgrading.
441
+ - **Dependency security** — `fastmcp` is pinned to version `3.0.2` and `webull-openapi-python-sdk` is pinned to `2.0.16`. Users are responsible for monitoring and updating third-party dependencies for security patches. Review release notes before upgrading.
437
442
 
438
443
  ---
439
444
 
@@ -526,6 +531,7 @@ webull-openapi-mcp/
526
531
  │ ├── __init__.py # Tool registration exports
527
532
  │ ├── market_data/
528
533
  │ │ ├── stock.py # Stock market data (snapshot, quotes, bars, tick, footprint, NOII)
534
+ │ │ ├── option.py # Option market data (tick, snapshot, bars)
529
535
  │ │ ├── futures.py # Futures market data
530
536
  │ │ ├── crypto.py # Crypto market data
531
537
  │ │ ├── event.py # Event contract market data
@@ -20,13 +20,13 @@ See [DISCLAIMER.md](DISCLAIMER.md) for the full disclaimer.
20
20
  ## Features
21
21
 
22
22
  - **Multi-Region Support** — US, HK, JP, SG, TH, MY, UK, MX, BR, EU, ZA, and AU regions with region-specific order types, trading sessions, and validation
23
- - **Market Data** — Real-time snapshots, tick data, quotes (depth), footprint, and OHLCV bars for stocks, futures, crypto, and event contracts
23
+ - **Market Data** — Real-time snapshots, tick data, quotes (depth), footprint, and OHLCV bars for stocks, options, futures, crypto, and event contracts
24
24
  - **NOII Data** — Net Order Imbalance Indicator bars and snapshots for US stock opening/closing auctions
25
25
  - **Screener** — Top gainers/losers, most active, market sectors, high dividend, and 52-week high/low rankings
26
26
  - **Watchlist** — Create, manage, and query user watchlists and instruments
27
27
  - **Fundamental Data** — Company profiles, analyst ratings, and target prices
28
- - **Stock & Fund Fundamentals** — Capital flow, SEC filings, earnings/dividend calendar, forecast EPS, industry comparison, and full fund data (rating, performance, allocation, holdings, brief, dividends, splits, net value, files) (US/HK/JP only)
29
- - **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow (US/HK/JP only)
28
+ - **Stock & Fund Fundamentals** — Capital flow, SEC filings, earnings/dividend calendar, forecast EPS, industry comparison, and full fund data (rating, performance, allocation, holdings, brief, dividends, splits, net value, files)
29
+ - **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow
30
30
  - **Trading** — Place, modify, cancel orders for stocks, options, futures, crypto, and event contracts
31
31
  - **Combo Orders** — OTO, OCO, OTOCO combo orders (US only)
32
32
  - **Option Strategies** — Multi-leg option strategies: vertical, straddle, strangle, butterfly, condor, etc. (US only)
@@ -92,6 +92,12 @@ Here are some prompts you can use with your AI assistant:
92
92
  - Buy 1 AAPL call option, strike $250, expiring 2026-04-17, limit price $5.00
93
93
  - Buy 1 TSLA put option, strike $200, expiring 2026-05-15
94
94
 
95
+ **Option Market Data**
96
+ - Get a snapshot for AAPL260522C00300000
97
+ - Show me tick data for TSLA251219C00450000
98
+ - Get daily bars for AAPL260522C00300000
99
+ - List available option contracts for AAPL expiring after 2026-06-01
100
+
95
101
  **Order Management**
96
102
  - Show me my order history for the last 7 days
97
103
  - What are my current open orders?
@@ -296,25 +302,25 @@ See [.env.example](.env.example) for full configuration template.
296
302
 
297
303
  ### Market Data
298
304
 
299
- | Category | Tools | Region |
300
- |----------|-------|--------|
301
- | **Stock** | `get_stock_tick`, `get_stock_snapshot`, `get_stock_quotes`, `get_stock_footprint`, `get_stock_bars`, `get_stock_bars_single`, `get_stock_noii_bars`, `get_stock_noii_snapshot` | All |
302
- | **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint` | US, HK |
303
- | **Crypto** | `get_crypto_snapshot`, `get_crypto_bars` | US |
304
- | **Event** | `get_event_tick`, `get_event_snapshot`, `get_event_depth`, `get_event_bars` | US |
305
- | **Screener** | `get_gainers_losers`, `get_most_active` | All |
306
- | **Screener (Sectors/Dividend/52W)** | `get_market_sectors`, `get_market_sectors_detail`, `get_high_dividend`, `get_52_week_high_low` | US, HK, JP |
305
+ | Category | Tools | Region |
306
+ |----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------|
307
+ | **Stock** | `get_stock_tick`, `get_stock_snapshot`, `get_stock_quotes`, `get_stock_footprint`, `get_stock_bars`, `get_stock_bars_single`, `get_stock_noii_bars`, `get_stock_noii_snapshot` | All |
308
+ | **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint` | US, HK |
309
+ | **Crypto** | `get_crypto_snapshot`, `get_crypto_bars` | US |
310
+ | **Option** | `get_option_tick`, `get_option_snapshot`, `get_option_bars` | US, HK, JP |
311
+ | **Event** | `get_event_tick`, `get_event_snapshot`, `get_event_depth`, `get_event_bars` | US |
312
+ | **Screener** | `get_gainers_losers`, `get_most_active`, `get_market_sectors`, `get_market_sectors_detail`, `get_high_dividend`, `get_52_week_high_low` | All |
307
313
  | **Watchlist** | `get_watchlists`, `create_watchlist`, `update_watchlist`, `delete_watchlist`, `get_watchlist_instruments`, `add_watchlist_instruments`, `remove_watchlist_instruments`, `update_watchlist_instruments` | All |
308
314
 
309
315
  ### Fundamental & Instrument
310
316
 
311
317
  | Category | Tools | Region |
312
318
  |----------|-------|--------|
313
- | **Instrument** | `get_instruments`, `get_futures_instruments`, `get_futures_products`, `get_crypto_instruments`, `get_event_series`, `get_event_instruments`, `get_event_categories`, `get_event_events` | varies |
319
+ | **Instrument** | `get_instruments`, `get_option_contracts`, `get_futures_instruments`, `get_futures_products`, `get_crypto_instruments`, `get_event_series`, `get_event_instruments`, `get_event_categories`, `get_event_events` | varies |
314
320
  | **Fundamental** | `get_company_profile`, `get_analyst_rating`, `get_analyst_target_price` | All |
315
- | **Stock Fundamentals** | `get_stock_capital_flow`, `get_stock_filings`, `get_stock_earnings_calendar`, `get_stock_dividend_calendar`, `get_stock_forecast_eps`, `get_stock_industry_comparison` | US, HK, JP |
316
- | **Fund Fundamentals** | `get_fund_rating`, `get_fund_performance`, `get_fund_allocation`, `get_fund_holdings`, `get_fund_brief`, `get_fund_dividends`, `get_fund_splits`, `get_fund_net_value`, `get_fund_files` | US, HK, JP |
317
- | **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` | US, HK, JP |
321
+ | **Stock Fundamentals** | `get_stock_capital_flow`, `get_stock_filings`, `get_stock_earnings_calendar`, `get_stock_dividend_calendar`, `get_stock_forecast_eps`, `get_stock_industry_comparison` | All |
322
+ | **Fund Fundamentals** | `get_fund_rating`, `get_fund_performance`, `get_fund_allocation`, `get_fund_holdings`, `get_fund_brief`, `get_fund_dividends`, `get_fund_splits`, `get_fund_net_value`, `get_fund_files` | All |
323
+ | **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` | All |
318
324
 
319
325
  ### Trading
320
326
 
@@ -334,31 +340,30 @@ See [.env.example](.env.example) for full configuration template.
334
340
 
335
341
  ### Region Differences
336
342
 
337
- | Feature | US | HK | JP | SG | TH | MY | UK | MX | BR | EU | ZA | AU |
338
- |---------|----|----|----|----|----|----|-----|----|----|----|----|-----|
339
- | Stock Trading | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
340
- | Option Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
341
- | Futures Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
342
- | Crypto Trading | Yes | No | No | No | No | No | No | No | No | No | No | No |
343
- | Event Contracts | Yes | No | No | No | No | No | No | No | No | No | No | No |
344
- | Combo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
345
- | Option Strategies | Yes | No | No | No | No | No | No | No | No | No | No | No |
346
- | Algo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
347
- | Screener (Gainers/Losers/Active) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
348
- | Screener (Sectors/Dividend/52W) | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
349
- | Watchlist | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
343
+ | Feature | US | HK | JP | SG | TH | MY | UK | MX | BR | EU | ZA | AU |
344
+ |-----------------------------|----|----|----|----|----|----|-----|----|----|----|----|-----|
345
+ | Stock Trading | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
346
+ | Option Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
347
+ | Futures Trading | Yes | Yes | No | No | No | No | No | No | No | No | No | No |
348
+ | Crypto Trading | Yes | No | No | No | No | No | No | No | No | No | No | No |
349
+ | Event Contracts | Yes | No | No | No | No | No | No | No | No | No | No | No |
350
+ | Combo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
351
+ | Option Strategies | Yes | No | No | No | No | No | No | No | No | No | No | No |
352
+ | Algo Orders | Yes | No | No | No | No | No | No | No | No | No | No | No |
353
+ | Screener | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
354
+ | Watchlist | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
350
355
  | Fundamental (Company/Analyst) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
351
- | Stock/Fund Fundamentals | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
352
- | Financial Statements | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No |
353
- | NOII (Auction Imbalance) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
354
- | Markets | US | US, HK, CN | US, JP | US | US | US | US | US | US | US | US | US |
355
- | Instrument Categories | US_STOCK, US_ETF | US_STOCK, US_ETF, HK_STOCK, CN_STOCK | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF |
356
- | Order Types | LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT, TRAILING_STOP_LOSS, etc. | LIMIT, MARKET, ENHANCED_LIMIT, AT_AUCTION, AT_AUCTION_LIMIT, etc. | JP market: LIMIT, MARKET — US market: LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT |
357
- | Time-in-Force | DAY, GTC | US market: DAY, GTC, GTD — HK market: DAY, GTC — CN market: DAY | JP market: DAY — US market: DAY, GTC, GTD | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC |
358
- | Trading Sessions | ALL, CORE, NIGHT | CORE, ALL_DAY, NIGHT, ALL | CORE, ALL, NIGHT, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY |
359
- | JP Order Fields | — | — | `account_tax_type` required (GENERAL or SPECIFIC); `margin_type` (ONE_DAY or INDEFINITE) and `position_intent` optional margin-account-only fields; `close_contracts` optional | — | — | — | — | — | — | — | — | — |
360
-
361
- > **Note:** Screener (Gainers/Losers/Active), Fundamental (Company/Analyst), and NOII currently only support querying US stock data (`US_STOCK` category). Stock/Fund Fundamentals, Financial Statements, and the extended Screener (Sectors/Dividend/52W) are available in US, HK, and JP regions; supported `category` values vary by endpoint (commonly `US_STOCK`, `HK_STOCK`, `CN_STOCK`, `JP_STOCK`). Watchlist supports US stocks and HK stocks.
356
+ | Stock/Fund Fundamentals | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
357
+ | Financial Statements | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
358
+ | NOII (Auction Imbalance) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
359
+ | Markets | US | US, HK, CN | US, JP | US | US | US | US | US | US | US | US | US |
360
+ | Instrument Categories | US_STOCK, US_ETF | US_STOCK, US_ETF, HK_STOCK, CN_STOCK | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF | US_STOCK, US_ETF |
361
+ | Order Types | LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT, TRAILING_STOP_LOSS, etc. | LIMIT, MARKET, ENHANCED_LIMIT, AT_AUCTION, AT_AUCTION_LIMIT, etc. | JP market: LIMIT, MARKET — US market: LIMIT, MARKET, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT | MARKET, LIMIT, STOP_LOSS, STOP_LOSS_LIMIT |
362
+ | Time-in-Force | DAY, GTC | US market: DAY, GTC, GTD — HK market: DAY, GTC — CN market: DAY | JP market: DAY — US market: DAY, GTC, GTD | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC | DAY, GTC |
363
+ | Trading Sessions | ALL, CORE, NIGHT | CORE, ALL_DAY, NIGHT, ALL | CORE, ALL, NIGHT, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY | NIGHT, ALL, CORE, ALL_DAY |
364
+ | JP Order Fields | — | — | `account_tax_type` required (GENERAL or SPECIFIC); `margin_type` (ONE_DAY or INDEFINITE) and `position_intent` optional margin-account-only fields; `close_contracts` optional | — | — | — | — | — | — | — | — | — |
365
+
366
+ > **Note:** Screener (Gainers/Losers/Active), Fundamental (Company/Analyst), and NOII currently only support querying US stock data (`US_STOCK` category). Stock/Fund Fundamentals, Financial Statements, and the extended Screener (Sectors/Dividend/52W) are available in all regions; supported `category` values vary by endpoint (commonly `US_STOCK`, `HK_STOCK`, `CN_STOCK`, `JP_STOCK`). Watchlist supports US stocks and HK stocks.
362
367
 
363
368
  ---
364
369
 
@@ -403,7 +408,7 @@ All commands accept `--env-file PATH` to specify a custom `.env` file location (
403
408
  - **Review before trading** — Always review order details proposed by the AI before confirming. Use `preview_stock_order` / `preview_option_order` before placing orders.
404
409
  - **Use toolset filtering** — Set `WEBULL_TOOLSETS=account,market-data` to disable trading tools entirely if you only need read-only access. Valid toolsets: `account`, `market-data`, `trading`, `instrument`.
405
410
  - **Default sandbox** — The server defaults to UAT (sandbox) environment. You must explicitly set `WEBULL_ENVIRONMENT=prod` for live trading.
406
- - **Dependency security** — `fastmcp` is pinned to version `3.0.2` and `webull-openapi-python-sdk` is pinned to `2.0.12`. Users are responsible for monitoring and updating third-party dependencies for security patches. Review release notes before upgrading.
411
+ - **Dependency security** — `fastmcp` is pinned to version `3.0.2` and `webull-openapi-python-sdk` is pinned to `2.0.16`. Users are responsible for monitoring and updating third-party dependencies for security patches. Review release notes before upgrading.
407
412
 
408
413
  ---
409
414
 
@@ -496,6 +501,7 @@ webull-openapi-mcp/
496
501
  │ ├── __init__.py # Tool registration exports
497
502
  │ ├── market_data/
498
503
  │ │ ├── stock.py # Stock market data (snapshot, quotes, bars, tick, footprint, NOII)
504
+ │ │ ├── option.py # Option market data (tick, snapshot, bars)
499
505
  │ │ ├── futures.py # Futures market data
500
506
  │ │ ├── crypto.py # Crypto market data
501
507
  │ │ ├── event.py # Event contract market data
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "webull-openapi-mcp"
7
- version = "1.2.0"
7
+ version = "1.2.2"
8
8
  description = "MCP Server for Webull OpenAPI - enables AI assistants to securely access Webull trading and market data"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -24,7 +24,7 @@ dependencies = [
24
24
  "fastmcp==3.0.2",
25
25
  "click",
26
26
  "python-dotenv",
27
- "webull-openapi-python-sdk==2.0.12",
27
+ "webull-openapi-python-sdk==2.0.17",
28
28
  ]
29
29
 
30
30
  [project.urls]
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.webull-inc/webull-openapi-mcp",
4
4
  "title": "Webull OpenAPI",
5
5
  "description": "MCP server for Webull OpenAPI: trading and market data access for AI assistants",
6
- "version": "1.2.0",
6
+ "version": "1.2.2",
7
7
  "repository": {
8
8
  "url": "https://github.com/webull-inc/webull-openapi-mcp",
9
9
  "source": "github"
@@ -13,7 +13,7 @@
13
13
  "registryType": "pypi",
14
14
  "registryBaseUrl": "https://pypi.org",
15
15
  "identifier": "webull-openapi-mcp",
16
- "version": "1.2.0",
16
+ "version": "1.2.2",
17
17
  "runtimeHint": "uvx",
18
18
  "transport": {
19
19
  "type": "stdio"
@@ -119,17 +119,13 @@ def test_property13_sdk_exception_via_registered_tool():
119
119
  register_order_tools(mcp, sdk, audit)
120
120
 
121
121
  # Get the registered tool function via public API
122
- loop = asyncio.new_event_loop()
123
- try:
124
- tool = loop.run_until_complete(mcp.get_tool("cancel_order"))
125
- assert tool is not None, "cancel_order tool not registered"
126
-
127
- with _patch_exceptions():
128
- result = loop.run_until_complete(
129
- tool.fn(account_id="a1", client_order_id="o1")
130
- )
131
- finally:
132
- loop.close()
122
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("cancel_order"))
123
+ assert tool is not None, "cancel_order tool not registered"
124
+
125
+ with _patch_exceptions():
126
+ result = asyncio.get_event_loop().run_until_complete(
127
+ tool.fn(account_id="a1", client_order_id="o1")
128
+ )
133
129
  assert isinstance(result, str)
134
130
  assert "SDK boom" in result or "Server error" in result
135
131
 
@@ -195,16 +191,12 @@ def test_property14_via_registered_stock_snapshot():
195
191
  register_stock_market_data_tools(mcp, sdk, audit, config)
196
192
 
197
193
  # Get the registered tool function via public API
198
- loop = asyncio.new_event_loop()
199
- try:
200
- tool = loop.run_until_complete(mcp.get_tool("get_stock_snapshot"))
194
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("get_stock_snapshot"))
201
195
 
202
- with _patch_exceptions():
203
- result = loop.run_until_complete(
204
- tool.fn(symbols="AAPL")
205
- )
206
- finally:
207
- loop.close()
196
+ with _patch_exceptions():
197
+ result = asyncio.get_event_loop().run_until_complete(
198
+ tool.fn(symbols="AAPL")
199
+ )
208
200
  assert _get_market_data_hint("us") in result
209
201
 
210
202
 
@@ -255,11 +247,7 @@ def test_jp_region_registers_expected_tool_subset():
255
247
  from webull_openapi_mcp.server import build_server
256
248
 
257
249
  server = build_server(_config(region_id="jp"))
258
- loop = asyncio.new_event_loop()
259
- try:
260
- tools = loop.run_until_complete(server.list_tools())
261
- finally:
262
- loop.close()
250
+ tools = asyncio.get_event_loop().run_until_complete(server.list_tools())
263
251
  names = {tool.name for tool in tools}
264
252
 
265
253
  assert "get_account_position_details" in names
@@ -299,11 +287,7 @@ def test_stock_order_schema_uses_string_account_id():
299
287
 
300
288
  register_stock_order_tools(mcp, sdk, audit, config)
301
289
 
302
- loop = asyncio.new_event_loop()
303
- try:
304
- tool = loop.run_until_complete(mcp.get_tool("place_stock_order"))
305
- finally:
306
- loop.close()
290
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("place_stock_order"))
307
291
  schema = tool.parameters["properties"]["account_id"]
308
292
  types = _schema_types(schema)
309
293
 
@@ -325,11 +309,7 @@ def test_stock_order_schema_exposes_jp_enum_values():
325
309
 
326
310
  register_stock_order_tools(mcp, sdk, audit, config)
327
311
 
328
- loop = asyncio.new_event_loop()
329
- try:
330
- tool = loop.run_until_complete(mcp.get_tool("place_stock_order"))
331
- finally:
332
- loop.close()
312
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("place_stock_order"))
333
313
  account_tax_type_schema = tool.parameters["properties"]["account_tax_type"]
334
314
  margin_type_schema = tool.parameters["properties"]["margin_type"]
335
315
  position_intent_schema = tool.parameters["properties"]["position_intent"]
@@ -374,11 +354,7 @@ def test_preview_stock_order_schema_exposes_jp_enum_values():
374
354
 
375
355
  register_stock_order_tools(mcp, sdk, audit, config)
376
356
 
377
- loop = asyncio.new_event_loop()
378
- try:
379
- tool = loop.run_until_complete(mcp.get_tool("preview_stock_order"))
380
- finally:
381
- loop.close()
357
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("preview_stock_order"))
382
358
  account_tax_type_schema = tool.parameters["properties"]["account_tax_type"]
383
359
  margin_type_schema = tool.parameters["properties"]["margin_type"]
384
360
 
@@ -410,11 +386,7 @@ def test_cancel_order_schema_uses_string_account_id():
410
386
 
411
387
  register_order_tools(mcp, sdk, audit)
412
388
 
413
- loop = asyncio.new_event_loop()
414
- try:
415
- tool = loop.run_until_complete(mcp.get_tool("cancel_order"))
416
- finally:
417
- loop.close()
389
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("cancel_order"))
418
390
  schema = tool.parameters["properties"]["account_id"]
419
391
  types = _schema_types(schema)
420
392
 
@@ -435,11 +407,7 @@ def test_place_stock_order_schema_uses_string_account_id():
435
407
 
436
408
  register_stock_order_tools(mcp, sdk, audit, config)
437
409
 
438
- loop = asyncio.new_event_loop()
439
- try:
440
- tool = loop.run_until_complete(mcp.get_tool("place_stock_order"))
441
- finally:
442
- loop.close()
410
+ tool = asyncio.get_event_loop().run_until_complete(mcp.get_tool("place_stock_order"))
443
411
  schema = tool.parameters["properties"]["account_id"]
444
412
  types = _schema_types(schema)
445
413
 
@@ -27,10 +27,10 @@ class TestUATEndpoints:
27
27
  assert UAT_ENDPOINTS["default_region"] == "us"
28
28
 
29
29
  def test_regions_list(self):
30
- assert set(UAT_ENDPOINTS["regions"]) == {"us", "hk", "jp", "sg", "th", "my", "uk", "mx", "br", "eu", "za", "au"}
30
+ assert set(UAT_ENDPOINTS["regions"]) == {"us", "hk", "jp", "sg", "th", "my", "uk", "mx", "br"}
31
31
 
32
32
  def test_each_region_has_all_api_types(self):
33
- for region in ("us", "hk", "jp", "sg", "th", "my", "uk", "mx", "br", "eu", "za", "au"):
33
+ for region in ("us", "hk", "jp", "sg", "th", "my", "uk", "mx", "br"):
34
34
  mapping = UAT_ENDPOINTS["region_mapping"][region]
35
35
  assert "api" in mapping
36
36
  assert "quotes-api" in mapping
@@ -38,9 +38,9 @@ class TestUATEndpoints:
38
38
 
39
39
  def test_us_api_endpoints(self):
40
40
  us = UAT_ENDPOINTS["region_mapping"]["us"]
41
- assert us["api"] == "api.sandbox.webull.com"
42
- assert us["quotes-api"] == "api.sandbox.webull.com"
43
- assert us["events-api"] == "events-api.sandbox.webull.com"
41
+ assert us["api"] == "us-openapi-alb.uat.webullbroker.com"
42
+ assert us["quotes-api"] == "us-openapi-quotes-api.uat.webullbroker.com"
43
+ assert us["events-api"] == "us-openapi-events.uat.webullbroker.com"
44
44
 
45
45
  def test_hk_api_endpoints(self):
46
46
  hk = UAT_ENDPOINTS["region_mapping"]["hk"]
@@ -183,9 +183,9 @@ class TestInitializeUAT:
183
183
  calls = api.add_endpoint.call_args_list
184
184
  call_args = [(c[0][0], c[0][1], c[0][2]) for c in calls]
185
185
 
186
- assert ("us", "api.sandbox.webull.com", DEFAULT) in call_args
187
- assert ("us", "api.sandbox.webull.com", QUOTES) in call_args
188
- assert ("us", "events-api.sandbox.webull.com", EVENTS) in call_args
186
+ assert ("us", "us-openapi-alb.uat.webullbroker.com", DEFAULT) in call_args
187
+ assert ("us", "us-openapi-quotes-api.uat.webullbroker.com", QUOTES) in call_args
188
+ assert ("us", "us-openapi-events.uat.webullbroker.com", EVENTS) in call_args
189
189
 
190
190
  def test_registers_all_endpoint_types_for_uat_hk(self, MockApiClient, MockTrade, MockData):
191
191
  cfg = ServerConfig(app_key="k", app_secret="s", region_id="hk", environment="uat")
@@ -1,3 +1,3 @@
1
1
  """Webull OpenAPI MCP Server - AI assistant integration for Webull OpenAPI."""
2
2
 
3
- __version__ = "1.2.0"
3
+ __version__ = "1.2.2"