browser_use/mcp/
handler.rs

1//! ServerHandler implementation for BrowserSession
2
3use crate::browser::BrowserSession;
4use log::debug;
5use rmcp::{
6    ServerHandler,
7    handler::server::tool::ToolRouter,
8    model::{ServerCapabilities, ServerInfo},
9    tool_handler,
10};
11use std::sync::{Arc, Mutex};
12
13/// MCP Server wrapper for BrowserSession
14///
15/// This struct holds a browser session and provides thread-safe access
16/// for MCP tool execution.
17#[derive(Clone)]
18pub struct BrowserServer {
19    session: Arc<Mutex<BrowserSession>>,
20    tool_router: ToolRouter<Self>,
21}
22
23impl BrowserServer {
24    /// Create a new browser server with default launch options
25    pub fn new() -> Result<Self, String> {
26        let session =
27            BrowserSession::new().map_err(|e| format!("Failed to launch browser: {}", e))?;
28
29        Ok(Self {
30            session: Arc::new(Mutex::new(session)),
31            tool_router: Self::tool_router(),
32        })
33    }
34
35    /// Create a new browser server with custom launch options
36    pub fn with_options(options: crate::browser::LaunchOptions) -> Result<Self, String> {
37        let session = BrowserSession::launch(options)
38            .map_err(|e| format!("Failed to launch browser: {}", e))?;
39
40        Ok(Self {
41            session: Arc::new(Mutex::new(session)),
42            tool_router: Self::tool_router(),
43        })
44    }
45
46    /// Get a reference to the browser session (blocking lock)
47    pub(crate) fn session(&self) -> std::sync::MutexGuard<'_, BrowserSession> {
48        self.session.lock().expect("Failed to lock browser session")
49    }
50}
51
52impl Default for BrowserServer {
53    fn default() -> Self {
54        Self::new().expect("Failed to create default browser server")
55    }
56}
57
58impl Drop for BrowserServer {
59    fn drop(&mut self) {
60        debug!("BrowserServer dropped");
61    }
62}
63
64#[tool_handler]
65impl ServerHandler for BrowserServer {
66    fn get_info(&self) -> ServerInfo {
67        ServerInfo {
68            instructions: Some("Browser-use MCP Server".into()),
69            capabilities: ServerCapabilities::builder().enable_tools().build(),
70            ..Default::default()
71        }
72    }
73}