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.
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.github/workflows/pypi-ci.yml +5 -9
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/PKG-INFO +49 -43
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/README.md +46 -40
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/pyproject.toml +2 -2
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/server.json +2 -2
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_server.py +18 -50
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_sdk_client.py +8 -8
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/__init__.py +1 -1
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/region_config.py +12 -4
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/server.py +4 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/__init__.py +2 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/__init__.py +2 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/financial.py +1 -1
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/fundamental.py +1 -1
- webull_openapi_mcp-1.2.2/webull_openapi_mcp/tools/market_data/option.py +221 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/screener.py +1 -1
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/futures_order.py +74 -1
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/instrument.py +83 -3
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.env.example +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/.gitignore +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/DISCLAIMER.md +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/LICENSE +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/.mcpbignore +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/build.sh +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/build_manifest.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/mcpb/src/server.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/__init__.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_account_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_audit.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_cli.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_config.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_errors.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_formatters.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_fundamental_screener_registration.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_fundamental_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_guards.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_instrument_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_market_data_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_audit.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_config.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_formatters.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_guards.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_property_sdk.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_screener_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/tests/test_stock_order_tools.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/__main__.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/audit.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/cli.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/config.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/constants.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/errors.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/formatters.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/guards.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/sdk_client.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/crypto.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/event.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/futures.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/stock.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/market_data/watchlist.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/__init__.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/account.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/assets.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/crypto_order.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/event_order.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/option_order.py +0 -0
- {webull_openapi_mcp-1.2.0 → webull_openapi_mcp-1.2.2}/webull_openapi_mcp/tools/trading/order.py +0 -0
- {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,
|
|
26
|
-
#
|
|
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
|
|
58
|
+
- name: Install build tooling
|
|
59
59
|
run: |
|
|
60
60
|
python -m pip install --upgrade pip
|
|
61
|
-
pip install build
|
|
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@
|
|
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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: webull-openapi-mcp
|
|
3
|
-
Version: 1.2.
|
|
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.
|
|
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)
|
|
59
|
-
- **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow
|
|
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
|
|
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`
|
|
332
|
-
| **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint`
|
|
333
|
-
| **Crypto** | `get_crypto_snapshot`, `get_crypto_bars`
|
|
334
|
-
| **
|
|
335
|
-
| **
|
|
336
|
-
| **Screener
|
|
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` |
|
|
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` |
|
|
347
|
-
| **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` |
|
|
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
|
|
368
|
-
|
|
369
|
-
| Stock Trading
|
|
370
|
-
| Option Trading
|
|
371
|
-
| Futures Trading
|
|
372
|
-
| Crypto Trading
|
|
373
|
-
| Event Contracts
|
|
374
|
-
| Combo Orders
|
|
375
|
-
| Option Strategies
|
|
376
|
-
| Algo Orders
|
|
377
|
-
| Screener
|
|
378
|
-
|
|
|
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
|
|
382
|
-
| Financial Statements
|
|
383
|
-
| NOII (Auction Imbalance)
|
|
384
|
-
| Markets
|
|
385
|
-
| Instrument Categories
|
|
386
|
-
| Order Types
|
|
387
|
-
| Time-in-Force
|
|
388
|
-
| Trading Sessions
|
|
389
|
-
| JP Order Fields
|
|
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
|
|
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.
|
|
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)
|
|
29
|
-
- **Financial Statements** — Financial alert, indicators, income statement, balance sheet, and cash flow
|
|
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
|
|
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`
|
|
302
|
-
| **Futures** | `get_futures_tick`, `get_futures_snapshot`, `get_futures_depth`, `get_futures_bars`, `get_futures_footprint`
|
|
303
|
-
| **Crypto** | `get_crypto_snapshot`, `get_crypto_bars`
|
|
304
|
-
| **
|
|
305
|
-
| **
|
|
306
|
-
| **Screener
|
|
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` |
|
|
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` |
|
|
317
|
-
| **Financial Statements** | `get_financial_alert`, `get_financial_indicators`, `get_income_statement`, `get_balance_sheet`, `get_cash_flow` |
|
|
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
|
|
338
|
-
|
|
339
|
-
| Stock Trading
|
|
340
|
-
| Option Trading
|
|
341
|
-
| Futures Trading
|
|
342
|
-
| Crypto Trading
|
|
343
|
-
| Event Contracts
|
|
344
|
-
| Combo Orders
|
|
345
|
-
| Option Strategies
|
|
346
|
-
| Algo Orders
|
|
347
|
-
| Screener
|
|
348
|
-
|
|
|
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
|
|
352
|
-
| Financial Statements
|
|
353
|
-
| NOII (Auction Imbalance)
|
|
354
|
-
| Markets
|
|
355
|
-
| Instrument Categories
|
|
356
|
-
| Order Types
|
|
357
|
-
| Time-in-Force
|
|
358
|
-
| Trading Sessions
|
|
359
|
-
| JP Order Fields
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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"
|
|
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"] == "
|
|
42
|
-
assert us["quotes-api"] == "api.
|
|
43
|
-
assert us["events-api"] == "events
|
|
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", "
|
|
187
|
-
assert ("us", "api.
|
|
188
|
-
assert ("us", "events
|
|
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")
|