tauri-mcp 0.1.4

MCP server for testing and interacting with Tauri v2 applications
Documentation
use crate::{Result, TauriMcpError};
use image::{DynamicImage, ImageFormat};
use screenshots::Screen;
use std::io::Cursor;

pub fn capture_screen_area(x: i32, y: i32, width: u32, height: u32) -> Result<DynamicImage> {
    let screens = Screen::all()
        .map_err(|e| TauriMcpError::ScreenshotError(format!("Failed to get screens: {}", e)))?;
    
    for screen in screens {
        let display_info = screen.display_info;
        if x >= display_info.x && y >= display_info.y &&
           x + width as i32 <= display_info.x + display_info.width as i32 &&
           y + height as i32 <= display_info.y + display_info.height as i32 {
            
            let image = screen.capture_area(x, y, width, height)
                .map_err(|e| TauriMcpError::ScreenshotError(format!("Failed to capture area: {}", e)))?;
            
            return Ok(image_to_dynamic(image)?);
        }
    }
    
    Err(TauriMcpError::ScreenshotError("No screen contains the specified area".to_string()))
}

pub fn capture_full_screen() -> Result<DynamicImage> {
    let screens = Screen::all()
        .map_err(|e| TauriMcpError::ScreenshotError(format!("Failed to get screens: {}", e)))?;
    
    if screens.is_empty() {
        return Err(TauriMcpError::ScreenshotError("No screens found".to_string()));
    }
    
    let image = screens[0].capture()
        .map_err(|e| TauriMcpError::ScreenshotError(format!("Failed to capture screen: {}", e)))?;
    
    image_to_dynamic(image)
}

fn image_to_dynamic(image: screenshots::image::RgbaImage) -> Result<DynamicImage> {
    Ok(DynamicImage::ImageRgba8(image))
}

pub fn image_to_base64(image: &DynamicImage) -> Result<String> {
    let mut buffer = Cursor::new(Vec::new());
    image.write_to(&mut buffer, ImageFormat::Png)
        .map_err(|e| TauriMcpError::ScreenshotError(format!("Failed to write image: {}", e)))?;
    
    use base64::{Engine as _, engine::general_purpose};
    Ok(general_purpose::STANDARD.encode(buffer.into_inner()))
}