Skip to main content

futu_mcp/tools/
trading_sessions.rs

1//! MCP proto-JSON tools for v1.8 exact trading sessions.
2
3use std::future::Future;
4use std::sync::Arc;
5
6use futu_net::client::FutuClient;
7use rmcp::{RoleServer, handler::server::wrapper::Parameters, service::RequestContext};
8use serde::de::DeserializeOwned;
9
10use crate::handlers;
11use crate::tool_args::ProtoJsonReq;
12
13use super::FutuServer;
14
15async fn run<C2S, F, Fut>(
16    server: &FutuServer,
17    tool_name: &'static str,
18    label: &'static str,
19    req: ProtoJsonReq,
20    req_ctx: RequestContext<RoleServer>,
21    handler: F,
22) -> std::result::Result<String, String>
23where
24    C2S: DeserializeOwned,
25    F: FnOnce(Arc<FutuClient>, C2S) -> Fut,
26    Fut: Future<Output = anyhow::Result<String>>,
27{
28    let c2s = match handlers::proto_json::parse_c2s_json::<C2S>(label, &req.c2s_json) {
29        Ok(c2s) => c2s,
30        Err(error) => return FutuServer::tool_err(error),
31    };
32    let client = server
33        .read_client_or_err(tool_name, &req_ctx, req.api_key.as_deref(), None)
34        .await?;
35    FutuServer::wrap_result(handler(client, c2s).await)
36}
37
38impl FutuServer {
39    async fn futu_get_security_trading_sessions_impl(
40        &self,
41        Parameters(req): Parameters<ProtoJsonReq>,
42        req_ctx: RequestContext<RoleServer>,
43    ) -> std::result::Result<String, String> {
44        run::<futu_proto::qot_get_security_trading_sessions::C2s, _, _>(
45            self,
46            "futu_get_security_trading_sessions",
47            "security-trading-sessions",
48            req,
49            req_ctx,
50            |client, c2s| async move {
51                handlers::proto_json::security_trading_sessions(&client, c2s).await
52            },
53        )
54        .await
55    }
56
57    async fn futu_get_market_trading_sessions_impl(
58        &self,
59        Parameters(req): Parameters<ProtoJsonReq>,
60        req_ctx: RequestContext<RoleServer>,
61    ) -> std::result::Result<String, String> {
62        run::<futu_proto::qot_get_market_trading_sessions::C2s, _, _>(
63            self,
64            "futu_get_market_trading_sessions",
65            "market-trading-sessions",
66            req,
67            req_ctx,
68            |client, c2s| async move {
69                handlers::proto_json::market_trading_sessions(&client, c2s).await
70            },
71        )
72        .await
73    }
74}
75
76include!(concat!(
77    env!("OUT_DIR"),
78    "/generated_mcp_routes_trading_sessions.rs"
79));