mod handler;
mod tools;
use handler::MyServerHandler;
use rust_mcp_sdk::{
error::SdkResult,
mcp_server::{hyper_server, server_runtime, HyperServerOptions, ServerRuntime},
schema::{
Implementation, InitializeResult, ServerCapabilities, ServerCapabilitiesTools,
LATEST_PROTOCOL_VERSION,
},
McpServer, StdioTransport, TransportOptions,
};
use tools::ServerTools;
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
pub async fn start_stdio() -> SdkResult<()> {
env_logger::init();
let server_details = InitializeResult {
server_info: Implementation {
name: "Syncable-MCP-Server".to_string(),
title: Some("Syncable MCP Server".to_string()),
version: env!("CARGO_PKG_VERSION").to_string(),
},
capabilities: ServerCapabilities {
tools: Some(ServerCapabilitiesTools { list_changed: None }),
..Default::default()
},
protocol_version: LATEST_PROTOCOL_VERSION.to_string(),
instructions: Some(
"Welcome to the Syncable-MCP-Server. Use list_tools to see available functionalities."
.into(),
),
meta: None,
};
let available_tools = ServerTools::tools();
eprintln!("🚀 Starting Syncable-MCP-Server (stdio mode)...");
eprintln!("📋 Available tools ({}):", available_tools.len());
for (i, tool) in available_tools.iter().enumerate() {
eprintln!(
" {}. {} - {}",
i + 1,
tool.name,
tool.description.as_deref().unwrap_or("No description")
);
}
eprintln!();
eprintln!("✅ Server initialized successfully. Listening for MCP requests...");
let transport = StdioTransport::new(TransportOptions::default())?;
let handler = MyServerHandler {};
let server: ServerRuntime = server_runtime::create_server(server_details, transport, handler);
server.start().await?;
Ok(())
}
pub async fn start_sse() -> SdkResult<()> {
tracing_subscriber::registry()
.with(fmt::layer())
.with(EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()))
.init();
tracing::info!("Logger initialized. Defining server details...");
let server_details = InitializeResult {
server_info: Implementation {
name: "Rust MCP Server (SSE)".to_string(),
title: Some("Rust MCP Server (SSE)".to_string()),
version: env!("CARGO_PKG_VERSION").to_string(),
},
capabilities: ServerCapabilities {
tools: Some(ServerCapabilitiesTools { list_changed: None }),
..Default::default()
},
protocol_version: LATEST_PROTOCOL_VERSION.to_string(),
instructions: Some(
"Welcome to the Rust MCP Server (SSE). Connect via a web client.".into(),
),
meta: None,
};
let available_tools = ServerTools::tools();
tracing::info!("🚀 Starting Rust MCP Server (SSE)...");
tracing::info!("📋 Available tools ({}):", available_tools.len());
for (i, tool) in available_tools.iter().enumerate() {
tracing::info!(
" {}. {} - {}",
i + 1,
tool.name,
tool.description.as_deref().unwrap_or("No description")
);
}
let handler = MyServerHandler {};
let port = std::env::var("MCP_PORT")
.ok()
.and_then(|s| s.parse::<u16>().ok())
.unwrap_or(8008);
let options = HyperServerOptions {
host: "0.0.0.0".to_string(),
port,
..Default::default()
};
tracing::info!("Creating the MCP SSE server...");
let server = hyper_server::create_server(server_details, handler, options);
tracing::info!("✅ SSE server listening on http://0.0.0.0:{}", port);
server.start().await?;
Ok(())
}