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