rust_mcp_server_syncable_cli/
lib.rs1mod 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 env_logger::init();
20
21 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 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 let transport = StdioTransport::new(TransportOptions::default())?;
57 let handler = MyServerHandler {};
58 let server: ServerRuntime = server_runtime::create_server(server_details, transport, handler);
59
60 server.start().await?;
62 Ok(())
63}
64
65pub async fn start_sse() -> SdkResult<()> {
66 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 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 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 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 server.start().await?;
123 Ok(())
124}