Skip to main content

futu_mcp/tools/
reference_shareholders_insider.rs

1//! MCP v10.6 shareholders and insider 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_get_shareholders_overview_impl(
11        &self,
12        Parameters(req): Parameters<ShareholdersOverviewReq>,
13        req_ctx: RequestContext<RoleServer>,
14    ) -> std::result::Result<String, String> {
15        tracing::info!(
16            tool = "futu_get_shareholders_overview",
17            symbol = %req.symbol,
18            period_id = ?req.period_id
19        );
20        let client = self
21            .read_client_or_err("futu_get_shareholders_overview", &req_ctx, None, None)
22            .await?;
23        Self::wrap_result(
24            handlers::reference::get_shareholders_overview(&client, &req.symbol, req.period_id)
25                .await,
26        )
27    }
28
29    async fn futu_get_shareholders_holding_changes_impl(
30        &self,
31        Parameters(req): Parameters<ShareholdersHoldingChangesReq>,
32        req_ctx: RequestContext<RoleServer>,
33    ) -> std::result::Result<String, String> {
34        req.validate()?;
35        tracing::info!(
36            tool = "futu_get_shareholders_holding_changes",
37            symbol = %req.symbol,
38            next_key = ?req.next_key,
39            num = ?req.num,
40            sort_type = ?req.sort_type,
41            sort_column = ?req.sort_column,
42            filter_type = ?req.filter_type
43        );
44        let client = self
45            .read_client_or_err(
46                "futu_get_shareholders_holding_changes",
47                &req_ctx,
48                None,
49                None,
50            )
51            .await?;
52        Self::wrap_result(
53            handlers::reference::get_shareholders_holding_changes(
54                &client,
55                &req.symbol,
56                req.next_key,
57                req.num,
58                req.sort_type,
59                req.sort_column,
60                req.filter_type,
61            )
62            .await,
63        )
64    }
65
66    async fn futu_get_shareholders_holder_detail_impl(
67        &self,
68        Parameters(req): Parameters<ShareholdersHolderDetailReq>,
69        req_ctx: RequestContext<RoleServer>,
70    ) -> std::result::Result<String, String> {
71        req.validate()?;
72        tracing::info!(
73            tool = "futu_get_shareholders_holder_detail",
74            symbol = %req.symbol,
75            request_type = ?req.request_type,
76            next_key = ?req.next_key,
77            num = ?req.num,
78            sort_column = ?req.sort_column,
79            sort_type = ?req.sort_type,
80            period_id = ?req.period_id,
81            holder_id = ?req.holder_id
82        );
83        let client = self
84            .read_client_or_err("futu_get_shareholders_holder_detail", &req_ctx, None, None)
85            .await?;
86        Self::wrap_result(
87            handlers::reference::get_shareholders_holder_detail(
88                &client,
89                &req.symbol,
90                req.request_type,
91                req.next_key,
92                req.num,
93                req.sort_column,
94                req.sort_type,
95                req.period_id,
96                req.holder_id,
97            )
98            .await,
99        )
100    }
101
102    async fn futu_get_shareholders_institutional_impl(
103        &self,
104        Parameters(req): Parameters<ShareholdersInstitutionalReq>,
105        req_ctx: RequestContext<RoleServer>,
106    ) -> std::result::Result<String, String> {
107        req.validate()?;
108        tracing::info!(
109            tool = "futu_get_shareholders_institutional",
110            symbol = %req.symbol,
111            next_key = ?req.next_key,
112            num = ?req.num
113        );
114        let client = self
115            .read_client_or_err("futu_get_shareholders_institutional", &req_ctx, None, None)
116            .await?;
117        Self::wrap_result(
118            handlers::reference::get_shareholders_institutional(
119                &client,
120                &req.symbol,
121                req.next_key,
122                req.num,
123            )
124            .await,
125        )
126    }
127
128    async fn futu_get_insider_holder_list_impl(
129        &self,
130        Parameters(req): Parameters<InsiderHolderListReq>,
131        req_ctx: RequestContext<RoleServer>,
132    ) -> std::result::Result<String, String> {
133        req.validate()?;
134        tracing::info!(
135            tool = "futu_get_insider_holder_list",
136            symbol = %req.symbol,
137            next_key = ?req.next_key,
138            num = ?req.num
139        );
140        let client = self
141            .read_client_or_err("futu_get_insider_holder_list", &req_ctx, None, None)
142            .await?;
143        Self::wrap_result(
144            handlers::reference::get_insider_holder_list(
145                &client,
146                &req.symbol,
147                req.next_key,
148                req.num,
149            )
150            .await,
151        )
152    }
153
154    async fn futu_get_insider_trade_list_impl(
155        &self,
156        Parameters(req): Parameters<InsiderTradeListReq>,
157        req_ctx: RequestContext<RoleServer>,
158    ) -> std::result::Result<String, String> {
159        req.validate()?;
160        tracing::info!(
161            tool = "futu_get_insider_trade_list",
162            symbol = %req.symbol,
163            holder_id = ?req.holder_id,
164            next_key = ?req.next_key,
165            num = ?req.num
166        );
167        let client = self
168            .read_client_or_err("futu_get_insider_trade_list", &req_ctx, None, None)
169            .await?;
170        Self::wrap_result(
171            handlers::reference::get_insider_trade_list(
172                &client,
173                &req.symbol,
174                req.holder_id,
175                req.next_key,
176                req.num,
177            )
178            .await,
179        )
180    }
181}
182
183include!(concat!(
184    env!("OUT_DIR"),
185    "/generated_mcp_routes_reference_shareholders_insider.rs"
186));