rust_mcp_server_syncable_cli/
lib.rs

1mod handler;
2mod tools;
3
4use handler::MyServerHandler;
5use rust_mcp_sdk::{
6    error::SdkResult,
7    mcp_server::{hyper_server, server_runtime, HyperServerOptions, ServerRuntime},
8    schema::{
9        Implementation, InitializeResult, ServerCapabilities, ServerCapabilitiesTools,
10        LATEST_PROTOCOL_VERSION,
11    },
12    McpServer, StdioTransport, TransportOptions,
13};
14use tools::ServerTools;
15use tracing_subscriber::{fmt, prelude::*, EnvFilter};
16
17pub async fn start_stdio() -> SdkResult<()> {
18    // 1) Init logging
19    env_logger::init();
20
21    // 2) Build initialize result
22    let server_details = InitializeResult {
23        server_info: Implementation {
24            name: "Syncable-MCP-Server".to_string(),
25            version: env!("CARGO_PKG_VERSION").to_string(),
26        },
27        capabilities: ServerCapabilities {
28            tools: Some(ServerCapabilitiesTools { list_changed: None }),
29            ..Default::default()
30        },
31        protocol_version: LATEST_PROTOCOL_VERSION.to_string(),
32        instructions: Some(
33            "Welcome to the Syncable-MCP-Server. Use list_tools to see available functionalities."
34                .into(),
35        ),
36        meta: None,
37    };
38
39    // 3) Log banners to stderr
40    let available_tools = ServerTools::tools();
41    eprintln!("🚀 Starting Syncable-MCP-Server (stdio mode)...");
42    eprintln!("📋 Available tools ({}):", available_tools.len());
43    for (i, tool) in available_tools.iter().enumerate() {
44        eprintln!(
45            "   {}. {} - {}",
46            i + 1,
47            tool.name,
48            tool.description.as_deref().unwrap_or("No description")
49        );
50    }
51    eprintln!();
52    eprintln!("✅ Server initialized successfully. Listening for MCP requests...");
53
54    // 4) Create transport and runtime
55    let transport = StdioTransport::new(TransportOptions::default())?;
56    let handler = MyServerHandler {};
57    let server: ServerRuntime = server_runtime::create_server(server_details, transport, handler);
58
59    // 5) Run
60    server.start().await?;
61    Ok(())
62}
63
64pub async fn start_sse() -> SdkResult<()> {
65    // 1) Initialize tracing
66    tracing_subscriber::registry()
67        .with(fmt::layer())
68        .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()))
69        .init();
70
71    tracing::info!("Logger initialized. Defining server details...");
72
73    // 2) Build initialize result
74    let server_details = InitializeResult {
75        server_info: Implementation {
76            name: "Rust MCP Server (SSE)".to_string(),
77            version: env!("CARGO_PKG_VERSION").to_string(),
78        },
79        capabilities: ServerCapabilities {
80            tools: Some(ServerCapabilitiesTools { list_changed: None }),
81            ..Default::default()
82        },
83        protocol_version: LATEST_PROTOCOL_VERSION.to_string(),
84        instructions: Some(
85            "Welcome to the Rust MCP Server (SSE). Connect via a web client.".into(),
86        ),
87        meta: None,
88    };
89
90    // 3) Log tools
91    let available_tools = ServerTools::tools();
92    tracing::info!("🚀 Starting Rust MCP Server (SSE)...");
93    tracing::info!("📋 Available tools ({}):", available_tools.len());
94    for (i, tool) in available_tools.iter().enumerate() {
95        tracing::info!(
96            "   {}. {} - {}",
97            i + 1,
98            tool.name,
99            tool.description.as_deref().unwrap_or("No description")
100        );
101    }
102
103    // 4) Create handler & server options
104    let handler = MyServerHandler {};
105    let options = HyperServerOptions {
106        host: "0.0.0.0".to_string(),
107        port: 8000,
108        ..Default::default()
109    };
110
111    tracing::info!("Creating the MCP SSE server...");
112    let server = hyper_server::create_server(server_details, handler, options);
113
114    tracing::info!("✅ SSE server listening on http://0.0.0.0:8000");
115    // 5) Run
116    server.start().await?;
117    Ok(())
118}