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.
Files changed (207) hide show
  1. futu_opend_mcp-0.1.1/.env.example +13 -0
  2. futu_opend_mcp-0.1.1/.github/workflows/ci.yml +14 -0
  3. futu_opend_mcp-0.1.1/.github/workflows/publish.yml +15 -0
  4. futu_opend_mcp-0.1.1/.gitignore +13 -0
  5. futu_opend_mcp-0.1.1/LICENSE +21 -0
  6. futu_opend_mcp-0.1.1/PKG-INFO +132 -0
  7. futu_opend_mcp-0.1.1/README.md +112 -0
  8. futu_opend_mcp-0.1.1/docs/superpowers/plans/2026-07-10-futu-opend-mcp.md +2202 -0
  9. futu_opend_mcp-0.1.1/docs/superpowers/specs/2026-07-10-futu-opend-mcp-design.md +270 -0
  10. futu_opend_mcp-0.1.1/pyproject.toml +44 -0
  11. futu_opend_mcp-0.1.1/scripts/sync_skill.sh +17 -0
  12. futu_opend_mcp-0.1.1/src/futu_opend_mcp/__init__.py +1 -0
  13. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_Futu_api_cn.md +30 -0
  14. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_Futu_api_en.md +29 -0
  15. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/LEGAL_zh.md +28 -0
  16. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/SKILL.md +2447 -0
  17. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/API_LIMITS.md +107 -0
  18. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/API_REFERENCE.md +270 -0
  19. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/FIELD_MAPPING.md +122 -0
  20. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/FUTURES_TRADING.md +173 -0
  21. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/docs/TROUBLESHOOTING.md +103 -0
  22. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/check_env.py +75 -0
  23. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/common.py +913 -0
  24. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_active_transaction.py +131 -0
  25. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_fund_holding.py +135 -0
  26. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ark_stock_dynamic.py +57 -0
  27. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_broker_queue.py +75 -0
  28. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_capital_distribution.py +92 -0
  29. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_capital_flow.py +92 -0
  30. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_executive_background.py +99 -0
  31. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_executives.py +139 -0
  32. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_operational_efficiency.py +133 -0
  33. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_company_profile.py +153 -0
  34. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_buybacks.py +284 -0
  35. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_dividends.py +146 -0
  36. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_corporate_actions_stock_splits.py +217 -0
  37. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_daily_short_volume.py +205 -0
  38. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_dividend_calendar.py +89 -0
  39. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_dividend_rank.py +146 -0
  40. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_earnings_beat_rank.py +162 -0
  41. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_earnings_calendar.py +151 -0
  42. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_economic_calendar.py +129 -0
  43. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_fed_watch_dot_plot.py +47 -0
  44. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_fed_watch_target_rate.py +47 -0
  45. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_earnings_price_history.py +258 -0
  46. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_earnings_price_move.py +149 -0
  47. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_revenue_breakdown.py +189 -0
  48. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_financials_statements.py +228 -0
  49. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_future_info.py +70 -0
  50. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_global_state.py +66 -0
  51. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_heat_map_data.py +113 -0
  52. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_high_dividend_soe_rank.py +125 -0
  53. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_history_kl_quota.py +68 -0
  54. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_hot_list.py +135 -0
  55. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_indicator_calc_result.py +206 -0
  56. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_indicator_list.py +142 -0
  57. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_by_plate.py +51 -0
  58. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_detail.py +47 -0
  59. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_chain_list.py +89 -0
  60. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_plate_info.py +47 -0
  61. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_industrial_plate_stock.py +117 -0
  62. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_insider_holder_list.py +165 -0
  63. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_insider_trade_list.py +185 -0
  64. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_distribution.py +65 -0
  65. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_holding_change.py +120 -0
  66. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_holding_list.py +129 -0
  67. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_list.py +109 -0
  68. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_institution_profile.py +58 -0
  69. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ipo_list.py +78 -0
  70. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_kline.py +203 -0
  71. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_macro_indicator_history.py +58 -0
  72. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_macro_indicator_list.py +66 -0
  73. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_market_state.py +75 -0
  74. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_chain.py +81 -0
  75. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_earnings_screener.py +162 -0
  76. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_event.py +160 -0
  77. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_event_alert.py +75 -0
  78. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_exercise_probability.py +108 -0
  79. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_expiration_date.py +63 -0
  80. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_market_statistic.py +95 -0
  81. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_quote.py +89 -0
  82. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_rank.py +157 -0
  83. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_screen.py +200 -0
  84. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_seller_screener.py +154 -0
  85. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy.py +102 -0
  86. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy_analysis.py +89 -0
  87. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_strategy_spread.py +88 -0
  88. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_his_statistic.py +89 -0
  89. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_his_volatility.py +88 -0
  90. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_overview.py +71 -0
  91. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_underlying_rank.py +156 -0
  92. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_volatility.py +148 -0
  93. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_zero_dte_contract.py +144 -0
  94. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_option_zero_dte_screener.py +157 -0
  95. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_orderbook.py +112 -0
  96. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_owner_plate.py +84 -0
  97. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_period_change_rank.py +148 -0
  98. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_plate_list.py +112 -0
  99. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_plate_stock.py +135 -0
  100. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_price_reminder.py +68 -0
  101. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rating_change.py +92 -0
  102. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_referencestock_list.py +77 -0
  103. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rehab.py +63 -0
  104. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_analyst_consensus.py +145 -0
  105. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_morningstar_report.py +265 -0
  106. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_research_rating_summary.py +352 -0
  107. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rise_fall_distribution.py +63 -0
  108. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_rt_data.py +91 -0
  109. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_search_news.py +122 -0
  110. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_search_quote.py +84 -0
  111. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_holder_detail.py +189 -0
  112. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_holding_changes.py +159 -0
  113. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_institutional.py +141 -0
  114. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_shareholders_overview.py +163 -0
  115. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_short_interest.py +189 -0
  116. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_short_selling_rank.py +133 -0
  117. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_snapshot.py +113 -0
  118. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_filter.py +396 -0
  119. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_info.py +91 -0
  120. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_quote.py +79 -0
  121. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_stock_screen.py +332 -0
  122. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_ticker.py +93 -0
  123. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_top_movers_rank.py +133 -0
  124. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_top_ten_buy_sell_brokers.py +130 -0
  125. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_trading_days.py +105 -0
  126. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_after_hours_rank.py +93 -0
  127. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_overnight_rank.py +93 -0
  128. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_us_pre_market_rank.py +93 -0
  129. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_info.py +87 -0
  130. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_security.py +65 -0
  131. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_user_security_group.py +80 -0
  132. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_valuation_detail.py +319 -0
  133. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_valuation_plate_stock_list.py +195 -0
  134. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_warrant.py +73 -0
  135. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/get_warrant_screen.py +222 -0
  136. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/modify_user_security.py +67 -0
  137. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/resolve_option_code.py +197 -0
  138. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/set_option_event_alert.py +138 -0
  139. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/quote/set_price_reminder.py +110 -0
  140. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_broker.py +99 -0
  141. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_kline.py +132 -0
  142. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_option_event.py +91 -0
  143. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_orderbook.py +113 -0
  144. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_quote.py +108 -0
  145. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_rt_data.py +101 -0
  146. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/push_ticker.py +101 -0
  147. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/query_subscription.py +78 -0
  148. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/subscribe.py +106 -0
  149. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/unsubscribe.py +78 -0
  150. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/subscribe/unsubscribe_all.py +51 -0
  151. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/cancel_crypto_order.py +91 -0
  152. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/cancel_order.py +103 -0
  153. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/comboorder_tradinginfo_query.py +178 -0
  154. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_acc_cash_flow.py +92 -0
  155. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_accounts.py +133 -0
  156. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_all_portfolios.py +228 -0
  157. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_accounts.py +102 -0
  158. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_cash_flow.py +67 -0
  159. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_max_trd_qtys.py +117 -0
  160. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_order_fee.py +97 -0
  161. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_orders.py +81 -0
  162. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_crypto_portfolio.py +121 -0
  163. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_history_order_fill_list.py +113 -0
  164. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_history_orders.py +139 -0
  165. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_margin_ratio.py +86 -0
  166. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_max_trd_qtys.py +125 -0
  167. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_order_fee.py +88 -0
  168. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_order_fill_list.py +95 -0
  169. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_orders.py +114 -0
  170. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/get_portfolio.py +190 -0
  171. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/modify_order.py +180 -0
  172. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_combo_order.py +284 -0
  173. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_crypto_order.py +219 -0
  174. futu_opend_mcp-0.1.1/src/futu_opend_mcp/_skill/futuapi/scripts/trade/place_order.py +243 -0
  175. futu_opend_mcp-0.1.1/src/futu_opend_mcp/config.py +59 -0
  176. futu_opend_mcp-0.1.1/src/futu_opend_mcp/connection.py +148 -0
  177. futu_opend_mcp-0.1.1/src/futu_opend_mcp/server.py +17 -0
  178. futu_opend_mcp-0.1.1/src/futu_opend_mcp/skill_runner.py +40 -0
  179. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/__init__.py +30 -0
  180. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/_base.py +38 -0
  181. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/capital.py +24 -0
  182. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/corporate_actions.py +24 -0
  183. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/derivatives.py +26 -0
  184. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/diagnostics.py +18 -0
  185. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/dividends.py +12 -0
  186. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/financials.py +58 -0
  187. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/industrial_chains.py +50 -0
  188. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/institutions.py +45 -0
  189. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/ipo.py +10 -0
  190. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/macro.py +42 -0
  191. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/options.py +87 -0
  192. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/plates.py +29 -0
  193. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/profile.py +37 -0
  194. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/quote.py +51 -0
  195. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/research.py +35 -0
  196. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/search.py +47 -0
  197. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/shareholders.py +52 -0
  198. futu_opend_mcp-0.1.1/src/futu_opend_mcp/tools/short.py +18 -0
  199. futu_opend_mcp-0.1.1/tests/conftest.py +11 -0
  200. futu_opend_mcp-0.1.1/tests/test_config.py +53 -0
  201. futu_opend_mcp-0.1.1/tests/test_connection.py +41 -0
  202. futu_opend_mcp-0.1.1/tests/test_integration.py +13 -0
  203. futu_opend_mcp-0.1.1/tests/test_server_smoke.py +22 -0
  204. futu_opend_mcp-0.1.1/tests/test_skill_runner.py +42 -0
  205. futu_opend_mcp-0.1.1/tests/test_tools_merge.py +169 -0
  206. futu_opend_mcp-0.1.1/tests/test_tools_quote.py +24 -0
  207. 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,13 @@
1
+ .env
2
+ *.egg-info/
3
+ __pycache__/
4
+ .venv/
5
+ dist/
6
+ build/
7
+ .pytest_cache/
8
+ *.pyc
9
+ *.pyo
10
+ .env.local
11
+ *.log
12
+ .mypy_cache/
13
+ .ruff_cache/
@@ -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.