Skip to main content
Glama

Stealth Browser MCP

by vibheksoni
models.pyβ€’8.11 kB
"""Data models for browser MCP server.""" from typing import Optional, List, Dict, Any from datetime import datetime from pydantic import BaseModel, Field from enum import Enum class BrowserState(str, Enum): """Browser instance states.""" STARTING = "starting" READY = "ready" NAVIGATING = "navigating" ERROR = "error" CLOSED = "closed" class BrowserInstance(BaseModel): """Represents a browser instance.""" instance_id: str = Field(description="Unique identifier for the browser instance") state: BrowserState = Field(default=BrowserState.STARTING) current_url: Optional[str] = Field(default=None, description="Current page URL") title: Optional[str] = Field(default=None, description="Current page title") created_at: datetime = Field(default_factory=datetime.now) last_activity: datetime = Field(default_factory=datetime.now) headless: bool = Field(default=False) user_agent: Optional[str] = None viewport: Dict[str, int] = Field(default_factory=lambda: {"width": 1920, "height": 1080}) def update_activity(self): """Update last activity timestamp.""" self.last_activity = datetime.now() class NetworkRequest(BaseModel): """Represents a captured network request.""" request_id: str = Field(description="Unique request identifier") instance_id: str = Field(description="Browser instance that made the request") url: str = Field(description="Request URL") method: str = Field(description="HTTP method") headers: Dict[str, str] = Field(default_factory=dict) cookies: Dict[str, str] = Field(default_factory=dict) post_data: Optional[str] = None timestamp: datetime = Field(default_factory=datetime.now) resource_type: Optional[str] = None class NetworkResponse(BaseModel): """Represents a captured network response.""" request_id: str = Field(description="Associated request ID") status: int = Field(description="HTTP status code") headers: Dict[str, str] = Field(default_factory=dict) content_length: Optional[int] = None content_type: Optional[str] = None body: Optional[bytes] = None timestamp: datetime = Field(default_factory=datetime.now) class ElementInfo(BaseModel): """Information about a DOM element.""" selector: str = Field(description="CSS selector or XPath") tag_name: str = Field(description="HTML tag name") text: Optional[str] = Field(default=None, description="Element text content") attributes: Dict[str, str] = Field(default_factory=dict) is_visible: bool = Field(default=True) is_clickable: bool = Field(default=False) bounding_box: Optional[Dict[str, float]] = None children_count: int = Field(default=0) class PageState(BaseModel): """Complete state snapshot of a page.""" instance_id: str url: str title: str ready_state: str = Field(description="Document ready state") cookies: List[Dict[str, Any]] = Field(default_factory=list) local_storage: Dict[str, str] = Field(default_factory=dict) session_storage: Dict[str, str] = Field(default_factory=dict) console_logs: List[Dict[str, Any]] = Field(default_factory=list) viewport: Dict[str, int] = Field(default_factory=dict) timestamp: datetime = Field(default_factory=datetime.now) class BrowserOptions(BaseModel): """Options for spawning a new browser instance.""" headless: bool = Field(default=False, description="Run browser in headless mode") user_agent: Optional[str] = Field(default=None, description="Custom user agent string") viewport_width: int = Field(default=1920, description="Viewport width in pixels") viewport_height: int = Field(default=1080, description="Viewport height in pixels") proxy: Optional[str] = Field(default=None, description="Proxy server URL") block_resources: List[str] = Field(default_factory=list, description="Resource types to block") extra_headers: Dict[str, str] = Field(default_factory=dict, description="Extra HTTP headers") user_data_dir: Optional[str] = Field(default=None, description="Path to user data directory") sandbox: bool = Field(default=True, description="Enable browser sandbox mode") class NavigationOptions(BaseModel): """Options for page navigation.""" wait_until: str = Field(default="load", description="Wait condition: load, domcontentloaded, networkidle") timeout: int = Field(default=30000, description="Navigation timeout in milliseconds") referrer: Optional[str] = Field(default=None, description="Referrer URL") class ScriptResult(BaseModel): """Result from script execution.""" success: bool result: Any = None error: Optional[str] = None execution_time: float = Field(description="Execution time in milliseconds") class ElementAction(str, Enum): """Types of element actions.""" CLICK = "click" TYPE = "type" SELECT = "select" HOVER = "hover" FOCUS = "focus" CLEAR = "clear" SCREENSHOT = "screenshot" class HookAction(str, Enum): """Types of network hook actions.""" MODIFY = "modify" BLOCK = "block" REDIRECT = "redirect" FULFILL = "fulfill" LOG = "log" class HookStage(str, Enum): """Stages at which hooks can intercept.""" REQUEST = "request" RESPONSE = "response" class HookStatus(str, Enum): """Status of a hook.""" ACTIVE = "active" INACTIVE = "inactive" PAUSED = "paused" class NetworkHook(BaseModel): """Represents a network hook rule.""" hook_id: str = Field(description="Unique hook identifier") name: str = Field(description="Human-readable hook name") url_pattern: str = Field(description="URL pattern to match (supports wildcards)") resource_type: Optional[str] = Field(default=None, description="Resource type filter") stage: HookStage = Field(description="When to intercept (request/response)") action: HookAction = Field(description="What to do with matched requests") status: HookStatus = Field(default=HookStatus.ACTIVE) priority: int = Field(default=100, description="Hook priority (lower = higher priority)") modifications: Dict[str, Any] = Field(default_factory=dict, description="Modifications to apply") redirect_url: Optional[str] = Field(default=None, description="URL to redirect to") custom_response: Optional[Dict[str, Any]] = Field(default=None, description="Custom response data") created_at: datetime = Field(default_factory=datetime.now) last_triggered: Optional[datetime] = None trigger_count: int = Field(default=0, description="Number of times this hook was triggered") class PendingRequest(BaseModel): """Represents a request awaiting modification.""" request_id: str = Field(description="Fetch request ID") instance_id: str = Field(description="Browser instance ID") url: str = Field(description="Original request URL") method: str = Field(description="HTTP method") headers: Dict[str, str] = Field(default_factory=dict) post_data: Optional[str] = None resource_type: Optional[str] = None stage: HookStage = Field(description="Current interception stage") matched_hooks: List[str] = Field(default_factory=list, description="IDs of hooks that matched") modifications: Dict[str, Any] = Field(default_factory=dict, description="Accumulated modifications") status: str = Field(default="pending", description="Processing status") created_at: datetime = Field(default_factory=datetime.now) expires_at: Optional[datetime] = None class RequestModification(BaseModel): """Represents modifications to apply to a request.""" url: Optional[str] = None method: Optional[str] = None headers: Optional[Dict[str, str]] = None post_data: Optional[str] = None intercept_response: Optional[bool] = None class ResponseModification(BaseModel): """Represents modifications to apply to a response.""" status_code: Optional[int] = None status_text: Optional[str] = None headers: Optional[Dict[str, str]] = None body: Optional[str] = None

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vibheksoni/stealth-browser-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server