Skip to main content

futu_mcp/tools/
reference_screen_unusual.rs

1//! MCP v10.6 screen and unusual-move reference tools.
2
3use crate::handlers;
4use crate::tool_args::*;
5use rmcp::{RoleServer, handler::server::wrapper::Parameters, service::RequestContext};
6
7use super::FutuServer;
8
9impl FutuServer {
10    async fn futu_stock_screen_impl(
11        &self,
12        Parameters(req): Parameters<StockScreenReq>,
13        req_ctx: RequestContext<RoleServer>,
14    ) -> std::result::Result<String, String> {
15        tracing::info!(tool = "futu_stock_screen");
16        let client = self
17            .read_client_or_err("futu_stock_screen", &req_ctx, None, None)
18            .await?;
19        Self::wrap_result(handlers::reference::stock_screen(&client, req.c2s).await)
20    }
21
22    async fn futu_option_screen_impl(
23        &self,
24        Parameters(req): Parameters<OptionScreenReq>,
25        req_ctx: RequestContext<RoleServer>,
26    ) -> std::result::Result<String, String> {
27        tracing::info!(tool = "futu_option_screen");
28        let client = self
29            .read_client_or_err("futu_option_screen", &req_ctx, None, None)
30            .await?;
31        Self::wrap_result(handlers::reference::option_screen(&client, req.c2s).await)
32    }
33
34    async fn futu_warrant_screen_impl(
35        &self,
36        Parameters(req): Parameters<WarrantScreenReq>,
37        req_ctx: RequestContext<RoleServer>,
38    ) -> std::result::Result<String, String> {
39        tracing::info!(tool = "futu_warrant_screen");
40        let client = self
41            .read_client_or_err("futu_warrant_screen", &req_ctx, None, None)
42            .await?;
43        Self::wrap_result(handlers::reference::warrant_screen(&client, req.c2s).await)
44    }
45
46    async fn futu_get_technical_unusual_impl(
47        &self,
48        Parameters(req): Parameters<TechnicalUnusualReq>,
49        req_ctx: RequestContext<RoleServer>,
50    ) -> std::result::Result<String, String> {
51        tracing::info!(
52            tool = "futu_get_technical_unusual",
53            stock_symbol = %req.stock_symbol,
54            time_range = ?req.time_range,
55            indicator_filter_count = req.indicator_filters.len(),
56            language_id = ?req.language_id
57        );
58        let client = self
59            .read_client_or_err("futu_get_technical_unusual", &req_ctx, None, None)
60            .await?;
61        Self::wrap_result(
62            handlers::reference::get_technical_unusual(
63                &client,
64                &req.stock_symbol,
65                req.time_range,
66                req.indicator_filters,
67                req.language_id,
68            )
69            .await,
70        )
71    }
72
73    async fn futu_get_financial_unusual_impl(
74        &self,
75        Parameters(req): Parameters<FinancialUnusualReq>,
76        req_ctx: RequestContext<RoleServer>,
77    ) -> std::result::Result<String, String> {
78        tracing::info!(
79            tool = "futu_get_financial_unusual",
80            stock_symbol = %req.stock_symbol,
81            time_range = ?req.time_range,
82            analysis_dimension_count = req.analysis_dimensions.len(),
83            language_id = ?req.language_id
84        );
85        let client = self
86            .read_client_or_err("futu_get_financial_unusual", &req_ctx, None, None)
87            .await?;
88        Self::wrap_result(
89            handlers::reference::get_financial_unusual(
90                &client,
91                &req.stock_symbol,
92                req.time_range,
93                req.analysis_dimensions,
94                req.language_id,
95            )
96            .await,
97        )
98    }
99
100    async fn futu_get_derivative_unusual_impl(
101        &self,
102        Parameters(req): Parameters<DerivativeUnusualReq>,
103        req_ctx: RequestContext<RoleServer>,
104    ) -> std::result::Result<String, String> {
105        tracing::info!(
106            tool = "futu_get_derivative_unusual",
107            stock_symbol = %req.stock_symbol,
108            time_range = ?req.time_range,
109            analysis_dimension_count = req.analysis_dimensions.len(),
110            language_id = ?req.language_id
111        );
112        let client = self
113            .read_client_or_err("futu_get_derivative_unusual", &req_ctx, None, None)
114            .await?;
115        Self::wrap_result(
116            handlers::reference::get_derivative_unusual(
117                &client,
118                &req.stock_symbol,
119                req.time_range,
120                req.analysis_dimensions,
121                req.language_id,
122            )
123            .await,
124        )
125    }
126}
127
128include!(concat!(
129    env!("OUT_DIR"),
130    "/generated_mcp_routes_reference_screen_unusual.rs"
131));