use crate::browser::BrowserSession;
use log::debug;
use rmcp::{
ServerHandler,
handler::server::tool::ToolRouter,
model::{ServerCapabilities, ServerInfo},
tool_handler,
};
use std::sync::{Arc, Mutex};
#[derive(Clone)]
pub struct BrowserServer {
session: Arc<Mutex<BrowserSession>>,
tool_router: ToolRouter<Self>,
}
impl BrowserServer {
pub fn new() -> Result<Self, String> {
let session =
BrowserSession::new().map_err(|e| format!("Failed to launch browser: {}", e))?;
Ok(Self {
session: Arc::new(Mutex::new(session)),
tool_router: Self::tool_router(),
})
}
pub fn with_options(options: crate::browser::LaunchOptions) -> Result<Self, String> {
let session = BrowserSession::launch(options)
.map_err(|e| format!("Failed to launch browser: {}", e))?;
Ok(Self {
session: Arc::new(Mutex::new(session)),
tool_router: Self::tool_router(),
})
}
pub(crate) fn session(&self) -> std::sync::MutexGuard<'_, BrowserSession> {
self.session.lock().expect("Failed to lock browser session")
}
}
impl Default for BrowserServer {
fn default() -> Self {
Self::new().expect("Failed to create default browser server")
}
}
impl Drop for BrowserServer {
fn drop(&mut self) {
debug!("BrowserServer dropped");
}
}
#[tool_handler]
impl ServerHandler for BrowserServer {
fn get_info(&self) -> ServerInfo {
ServerInfo {
instructions: Some("Browser-use MCP Server".into()),
capabilities: ServerCapabilities::builder().enable_tools().build(),
..Default::default()
}
}
}