futu-opend-mcp 0.1.1__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.
- futu_opend_mcp-0.1.1/.env.example +13 -0
- futu_opend_mcp-0.1.1/.github/workflows/ci.yml +14 -0
- futu_opend_mcp-0.1.1/.github/workflows/publish.yml +15 -0
- futu_opend_mcp-0.1.1/.gitignore +13 -0
- futu_opend_mcp-0.1.1/LICENSE +21 -0
- futu_opend_mcp-0.1.1/PKG-INFO +132 -0
- futu_opend_mcp-0.1.1/README.md +112 -0
- futu_opend_mcp-0.1.1/docs/superpowers/plans/2026-07-10-futu-opend-mcp.md +2202 -0
- futu_opend_mcp-0.1.1/docs/superpowers/specs/2026-07-10-futu-opend-mcp-design.md +270 -0
- futu_opend_mcp-0.1.1/pyproject.toml +44 -0
- futu_opend_mcp-0.1.1/scripts/sync_skill.sh +17 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/__init__.py +1 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_Futu_api_cn.md +30 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_Futu_api_en.md +29 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_zh.md +28 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/SKILL.md +2447 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/API_LIMITS.md +107 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/API_REFERENCE.md +270 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/FIELD_MAPPING.md +122 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/FUTURES_TRADING.md +173 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/TROUBLESHOOTING.md +103 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/check_env.py +75 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/common.py +913 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_active_transaction.py +131 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_fund_holding.py +135 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_stock_dynamic.py +57 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_broker_queue.py +75 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_capital_distribution.py +92 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_capital_flow.py +92 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_executive_background.py +99 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_executives.py +139 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_operational_efficiency.py +133 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_profile.py +153 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_buybacks.py +284 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_dividends.py +146 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_stock_splits.py +217 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_daily_short_volume.py +205 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_dividend_calendar.py +89 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_dividend_rank.py +146 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_earnings_beat_rank.py +162 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_earnings_calendar.py +151 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_economic_calendar.py +129 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_fed_watch_dot_plot.py +47 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_fed_watch_target_rate.py +47 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_earnings_price_history.py +258 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_earnings_price_move.py +149 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_revenue_breakdown.py +189 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_statements.py +228 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_future_info.py +70 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_global_state.py +66 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_heat_map_data.py +113 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_high_dividend_soe_rank.py +125 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_history_kl_quota.py +68 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_hot_list.py +135 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_indicator_calc_result.py +206 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_indicator_list.py +142 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_by_plate.py +51 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_detail.py +47 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_list.py +89 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_plate_info.py +47 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_plate_stock.py +117 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_insider_holder_list.py +165 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_insider_trade_list.py +185 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_distribution.py +65 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_holding_change.py +120 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_holding_list.py +129 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_list.py +109 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_profile.py +58 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ipo_list.py +78 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_kline.py +203 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_macro_indicator_history.py +58 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_macro_indicator_list.py +66 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_market_state.py +75 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_chain.py +81 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_earnings_screener.py +162 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_event.py +160 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_event_alert.py +75 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_exercise_probability.py +108 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_expiration_date.py +63 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_market_statistic.py +95 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_quote.py +89 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_rank.py +157 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_screen.py +200 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_seller_screener.py +154 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy.py +102 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy_analysis.py +89 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy_spread.py +88 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_his_statistic.py +89 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_his_volatility.py +88 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_overview.py +71 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_rank.py +156 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_volatility.py +148 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_zero_dte_contract.py +144 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_zero_dte_screener.py +157 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_orderbook.py +112 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_owner_plate.py +84 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_period_change_rank.py +148 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_plate_list.py +112 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_plate_stock.py +135 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_price_reminder.py +68 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rating_change.py +92 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_referencestock_list.py +77 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rehab.py +63 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_analyst_consensus.py +145 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_morningstar_report.py +265 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_rating_summary.py +352 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rise_fall_distribution.py +63 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rt_data.py +91 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_search_news.py +122 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_search_quote.py +84 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_holder_detail.py +189 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_holding_changes.py +159 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_institutional.py +141 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_overview.py +163 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_short_interest.py +189 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_short_selling_rank.py +133 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_snapshot.py +113 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_filter.py +396 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_info.py +91 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_quote.py +79 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_screen.py +332 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ticker.py +93 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_top_movers_rank.py +133 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_top_ten_buy_sell_brokers.py +130 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_trading_days.py +105 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_after_hours_rank.py +93 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_overnight_rank.py +93 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_pre_market_rank.py +93 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_info.py +87 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_security.py +65 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_security_group.py +80 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_valuation_detail.py +319 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_valuation_plate_stock_list.py +195 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_warrant.py +73 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_warrant_screen.py +222 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/modify_user_security.py +67 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/resolve_option_code.py +197 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/set_option_event_alert.py +138 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/set_price_reminder.py +110 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_broker.py +99 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_kline.py +132 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_option_event.py +91 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_orderbook.py +113 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_quote.py +108 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_rt_data.py +101 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_ticker.py +101 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/query_subscription.py +78 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/subscribe.py +106 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/unsubscribe.py +78 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/unsubscribe_all.py +51 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/cancel_crypto_order.py +91 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/cancel_order.py +103 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/comboorder_tradinginfo_query.py +178 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_acc_cash_flow.py +92 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_accounts.py +133 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_all_portfolios.py +228 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_accounts.py +102 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_cash_flow.py +67 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_max_trd_qtys.py +117 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_order_fee.py +97 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_orders.py +81 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_portfolio.py +121 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_history_order_fill_list.py +113 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_history_orders.py +139 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_margin_ratio.py +86 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_max_trd_qtys.py +125 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_order_fee.py +88 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_order_fill_list.py +95 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_orders.py +114 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_portfolio.py +190 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/modify_order.py +180 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_combo_order.py +284 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_crypto_order.py +219 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_order.py +243 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/config.py +59 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/connection.py +148 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/server.py +17 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/skill_runner.py +40 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/__init__.py +30 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/_base.py +38 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/capital.py +24 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/corporate_actions.py +24 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/derivatives.py +26 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/diagnostics.py +18 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/dividends.py +12 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/financials.py +58 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/industrial_chains.py +50 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/institutions.py +45 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/ipo.py +10 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/macro.py +42 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/options.py +87 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/plates.py +29 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/profile.py +37 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/quote.py +51 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/research.py +35 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/search.py +47 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/shareholders.py +52 -0
- futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/short.py +18 -0
- futu_opend_mcp-0.1.1/tests/conftest.py +11 -0
- futu_opend_mcp-0.1.1/tests/test_config.py +53 -0
- futu_opend_mcp-0.1.1/tests/test_connection.py +41 -0
- futu_opend_mcp-0.1.1/tests/test_integration.py +13 -0
- futu_opend_mcp-0.1.1/tests/test_server_smoke.py +22 -0
- futu_opend_mcp-0.1.1/tests/test_skill_runner.py +42 -0
- futu_opend_mcp-0.1.1/tests/test_tools_merge.py +169 -0
- futu_opend_mcp-0.1.1/tests/test_tools_quote.py +24 -0
- futu_opend_mcp-0.1.1/tests/test_tools_search_financials.py +19 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Futu OpenD gateway (must already be running + logged in)
|
|
2
|
+
FUTU_OPEND_HOST=127.0.0.1
|
|
3
|
+
FUTU_OPEND_PORT=11111
|
|
4
|
+
|
|
5
|
+
# RSA private key (shared with OpenD's FutuOpenD.xml), PKCS#1 1024-bit PEM.
|
|
6
|
+
# Provide ONE of the two forms:
|
|
7
|
+
FUTU_OPEND_RSA_KEY=
|
|
8
|
+
FUTU_OPEND_RSA_KEY_FILE=
|
|
9
|
+
|
|
10
|
+
# Enable proto encryption. Set false ONLY for a local 127.0.0.1 OpenD.
|
|
11
|
+
FUTU_OPEND_ENCRYPT=true
|
|
12
|
+
|
|
13
|
+
FUTU_OPEND_LOG_LEVEL=INFO
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
on:
|
|
3
|
+
push: { branches: [main] }
|
|
4
|
+
pull_request:
|
|
5
|
+
jobs:
|
|
6
|
+
test:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
steps:
|
|
9
|
+
- uses: actions/checkout@v4
|
|
10
|
+
- uses: actions/setup-python@v5
|
|
11
|
+
with: { python-version: "3.12" }
|
|
12
|
+
- run: pip install -e ".[dev]"
|
|
13
|
+
- run: ruff check .
|
|
14
|
+
- run: pytest -q -m "not integration"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
name: publish
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ["v*"]
|
|
5
|
+
jobs:
|
|
6
|
+
build:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
permissions: { id-token: write }
|
|
9
|
+
steps:
|
|
10
|
+
- uses: actions/checkout@v4
|
|
11
|
+
- uses: actions/setup-python@v5
|
|
12
|
+
with: { python-version: "3.12" }
|
|
13
|
+
- run: pip install build && python -m build
|
|
14
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
15
|
+
# Configure trusted publishing at https://pypi.org/manage/project/futu-opend-mcp/publishing/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 eli
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: futu-opend-mcp
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: MCP server exposing Futu OpenD read-only investment-research quote APIs.
|
|
5
|
+
Author: eli
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: finance,futu,mcp,opend,stock
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.10
|
|
13
|
+
Requires-Dist: futu-api>=10.5.6508
|
|
14
|
+
Requires-Dist: mcp>=1.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
18
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# futu-opend-mcp
|
|
22
|
+
|
|
23
|
+
An MCP server that exposes Futu OpenD's **read-only investment-research** quote APIs
|
|
24
|
+
(stock/option/warrant/futures prices, financials, news/announcements, shareholders,
|
|
25
|
+
institutions, macro) as MCP tools. It borrows your already-running, logged-in Futu
|
|
26
|
+
OpenD gateway - no separate auth. No trading, no subscriptions.
|
|
27
|
+
|
|
28
|
+
It wraps the [official Futu skill pack](https://openapi.futunn.com/skills/opend-skills.zip)
|
|
29
|
+
unmodified, so it stays in sync with Futu's own field-parsing logic.
|
|
30
|
+
|
|
31
|
+
## Install & run
|
|
32
|
+
|
|
33
|
+
### Claude Code / Claude Desktop (stdio)
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
claude mcp add futu-opend-mcp -- uvx futu-opend-mcp
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or from git before a PyPI release:
|
|
40
|
+
```
|
|
41
|
+
claude mcp add futu-opend-mcp -- uvx --from git+https://github.com/ER-EPR/futu-opend-mcp futu-opend-mcp
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Open WebUI via mcpo (HTTP)
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
uvx mcpo --port 8000 -- futu-opend-mcp
|
|
48
|
+
# OpenAPI at http://localhost:8000, docs at /docs
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### MCP JSON config
|
|
52
|
+
|
|
53
|
+
Add to `~/.claude/settings.json`, `.mcp.json`, or Claude Desktop config:
|
|
54
|
+
|
|
55
|
+
**Remote OpenD (with encryption):**
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"futu-opend": {
|
|
60
|
+
"command": "uvx",
|
|
61
|
+
"args": ["futu-opend-mcp"],
|
|
62
|
+
"env": {
|
|
63
|
+
"FUTU_OPEND_HOST": "your-opend-host",
|
|
64
|
+
"FUTU_OPEND_PORT": "11111",
|
|
65
|
+
"FUTU_OPEND_ENCRYPT": "true",
|
|
66
|
+
"FUTU_OPEND_RSA_KEY": "-----BEGIN RSA PRIVATE KEY-----\\nMIIC...\\n-----END RSA PRIVATE KEY-----"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Local OpenD (no encryption):**
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"mcpServers": {
|
|
77
|
+
"futu-opend": {
|
|
78
|
+
"command": "uvx",
|
|
79
|
+
"args": ["futu-opend-mcp"],
|
|
80
|
+
"env": {
|
|
81
|
+
"FUTU_OPEND_ENCRYPT": "false"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Extract the RSA key for the env var:
|
|
89
|
+
```bash
|
|
90
|
+
docker exec futu-opend cat /rsa/rsa_private_pkcs1.pem | awk '{printf "%s\\n", $0}'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Configuration (env vars)
|
|
94
|
+
|
|
95
|
+
| Var | Default | Purpose |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `FUTU_OPEND_HOST` | `127.0.0.1` | OpenD host |
|
|
98
|
+
| `FUTU_OPEND_PORT` | `11111` | OpenD port |
|
|
99
|
+
| `FUTU_OPEND_RSA_KEY` | - | inline PEM of the shared RSA private key |
|
|
100
|
+
| `FUTU_OPEND_RSA_KEY_FILE` | - | path to the PEM file (alternative to above) |
|
|
101
|
+
| `FUTU_OPEND_ENCRYPT` | `true` | proto encryption; `false` for local 127.0.0.1 OpenD |
|
|
102
|
+
| `FUTU_OPEND_LOG_LEVEL` | `INFO` | logging level |
|
|
103
|
+
|
|
104
|
+
OpenD and the SDK share one RSA private key (PKCS#1 1024-bit). Get it from a dockerized
|
|
105
|
+
OpenD with: `docker compose logs opend | grep -A20 'NEW RSA PRIVATE KEY'`.
|
|
106
|
+
|
|
107
|
+
## Tools
|
|
108
|
+
|
|
109
|
+
~50 read-only tools across: price/quote, search, screening, financials, research/valuation,
|
|
110
|
+
corporate actions, shareholders, profile, capital flow, short interest, options, option
|
|
111
|
+
underlying IV/HV, warrants/futures, plates, industrial chains, institutions, macro,
|
|
112
|
+
dividends, IPO, and diagnostics. See `docs/superpowers/specs/2026-07-10-futu-opend-mcp-design.md`.
|
|
113
|
+
|
|
114
|
+
## Development
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
pip install -e ".[dev]"
|
|
118
|
+
pytest -q -m "not integration" # unit tests (no OpenD needed)
|
|
119
|
+
ruff check .
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Live-OpenD integration tests are marked `integration` and skip themselves when OpenD is
|
|
123
|
+
unreachable. Re-vendor the official skill pack with `./scripts/sync_skill.sh`.
|
|
124
|
+
|
|
125
|
+
## Attribution
|
|
126
|
+
|
|
127
|
+
Wraps the official Futu `futuapi` skill pack (vendored under
|
|
128
|
+
`src/futu_opend_mcp/_skill/futuapi/`, unmodified). Legal terms in that folder apply.
|
|
129
|
+
|
|
130
|
+
## License
|
|
131
|
+
|
|
132
|
+
MIT.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# futu-opend-mcp
|
|
2
|
+
|
|
3
|
+
An MCP server that exposes Futu OpenD's **read-only investment-research** quote APIs
|
|
4
|
+
(stock/option/warrant/futures prices, financials, news/announcements, shareholders,
|
|
5
|
+
institutions, macro) as MCP tools. It borrows your already-running, logged-in Futu
|
|
6
|
+
OpenD gateway - no separate auth. No trading, no subscriptions.
|
|
7
|
+
|
|
8
|
+
It wraps the [official Futu skill pack](https://openapi.futunn.com/skills/opend-skills.zip)
|
|
9
|
+
unmodified, so it stays in sync with Futu's own field-parsing logic.
|
|
10
|
+
|
|
11
|
+
## Install & run
|
|
12
|
+
|
|
13
|
+
### Claude Code / Claude Desktop (stdio)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
claude mcp add futu-opend-mcp -- uvx futu-opend-mcp
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or from git before a PyPI release:
|
|
20
|
+
```
|
|
21
|
+
claude mcp add futu-opend-mcp -- uvx --from git+https://github.com/ER-EPR/futu-opend-mcp futu-opend-mcp
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Open WebUI via mcpo (HTTP)
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
uvx mcpo --port 8000 -- futu-opend-mcp
|
|
28
|
+
# OpenAPI at http://localhost:8000, docs at /docs
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### MCP JSON config
|
|
32
|
+
|
|
33
|
+
Add to `~/.claude/settings.json`, `.mcp.json`, or Claude Desktop config:
|
|
34
|
+
|
|
35
|
+
**Remote OpenD (with encryption):**
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"futu-opend": {
|
|
40
|
+
"command": "uvx",
|
|
41
|
+
"args": ["futu-opend-mcp"],
|
|
42
|
+
"env": {
|
|
43
|
+
"FUTU_OPEND_HOST": "your-opend-host",
|
|
44
|
+
"FUTU_OPEND_PORT": "11111",
|
|
45
|
+
"FUTU_OPEND_ENCRYPT": "true",
|
|
46
|
+
"FUTU_OPEND_RSA_KEY": "-----BEGIN RSA PRIVATE KEY-----\\nMIIC...\\n-----END RSA PRIVATE KEY-----"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Local OpenD (no encryption):**
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"mcpServers": {
|
|
57
|
+
"futu-opend": {
|
|
58
|
+
"command": "uvx",
|
|
59
|
+
"args": ["futu-opend-mcp"],
|
|
60
|
+
"env": {
|
|
61
|
+
"FUTU_OPEND_ENCRYPT": "false"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Extract the RSA key for the env var:
|
|
69
|
+
```bash
|
|
70
|
+
docker exec futu-opend cat /rsa/rsa_private_pkcs1.pem | awk '{printf "%s\\n", $0}'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Configuration (env vars)
|
|
74
|
+
|
|
75
|
+
| Var | Default | Purpose |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `FUTU_OPEND_HOST` | `127.0.0.1` | OpenD host |
|
|
78
|
+
| `FUTU_OPEND_PORT` | `11111` | OpenD port |
|
|
79
|
+
| `FUTU_OPEND_RSA_KEY` | - | inline PEM of the shared RSA private key |
|
|
80
|
+
| `FUTU_OPEND_RSA_KEY_FILE` | - | path to the PEM file (alternative to above) |
|
|
81
|
+
| `FUTU_OPEND_ENCRYPT` | `true` | proto encryption; `false` for local 127.0.0.1 OpenD |
|
|
82
|
+
| `FUTU_OPEND_LOG_LEVEL` | `INFO` | logging level |
|
|
83
|
+
|
|
84
|
+
OpenD and the SDK share one RSA private key (PKCS#1 1024-bit). Get it from a dockerized
|
|
85
|
+
OpenD with: `docker compose logs opend | grep -A20 'NEW RSA PRIVATE KEY'`.
|
|
86
|
+
|
|
87
|
+
## Tools
|
|
88
|
+
|
|
89
|
+
~50 read-only tools across: price/quote, search, screening, financials, research/valuation,
|
|
90
|
+
corporate actions, shareholders, profile, capital flow, short interest, options, option
|
|
91
|
+
underlying IV/HV, warrants/futures, plates, industrial chains, institutions, macro,
|
|
92
|
+
dividends, IPO, and diagnostics. See `docs/superpowers/specs/2026-07-10-futu-opend-mcp-design.md`.
|
|
93
|
+
|
|
94
|
+
## Development
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
pip install -e ".[dev]"
|
|
98
|
+
pytest -q -m "not integration" # unit tests (no OpenD needed)
|
|
99
|
+
ruff check .
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Live-OpenD integration tests are marked `integration` and skip themselves when OpenD is
|
|
103
|
+
unreachable. Re-vendor the official skill pack with `./scripts/sync_skill.sh`.
|
|
104
|
+
|
|
105
|
+
## Attribution
|
|
106
|
+
|
|
107
|
+
Wraps the official Futu `futuapi` skill pack (vendored under
|
|
108
|
+
`src/futu_opend_mcp/_skill/futuapi/`, unmodified). Legal terms in that folder apply.
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT.
|