browser_use/mcp/
handler.rs1use 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#[derive(Clone)]
18pub struct BrowserServer {
19 session: Arc<Mutex<BrowserSession>>,
20 tool_router: ToolRouter<Self>,
21}
22
23impl BrowserServer {
24 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 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 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}