Screenshot MCP Gateway
by davinoishi
README.md
# Screenshot MCP Gateway
A unified MCP (Model Context Protocol) server that combines screenshot capture capabilities with HTTP/SSE gateway functionality for remote access. This project integrates [HTTP-ScreenShotMCP](https://github.com/davinoishi/HTTP-ScreenShotMCP) with [Supergateway](https://github.com/supercorp-ai/supergateway) to provide a single deployable solution for remote screenshot services.
## Features
- ✅ Full-page screenshot capture with Puppeteer
- ✅ Element-specific screenshots using CSS selectors
- ✅ Device viewport presets (mobile, tablet, desktop)
- ✅ Custom viewport configurations
- ✅ Advanced wait conditions (selector, function, timeout, networkidle)
- ✅ HTTP/SSE transport for remote access
- ✅ CORS support for cross-origin requests
- ✅ Headless browser operation (perfect for server deployments)
- ✅ Automatic Chrome installation for headless environments
## Quick Start
### Installation
```bash
npm install
```
This will automatically:
1. Install all dependencies
2. Download and configure Chromium for headless operation
3. Build the TypeScript source
### Running the Server
```bash
npm start
```
The server will start on port 3000 (or the port specified in `PORT` environment variable).
**Endpoints:**
- SSE MCP endpoint: `http://localhost:3000/sse`
- Health check: `http://localhost:3000/health`
### Configuration
Copy `.env.example` to `.env` and customize:
```bash
cp .env.example .env
```
**Environment Variables:**
- `PORT`: Server port (default: 3000)
- `BROWSER_HEADLESS`: Run browser in headless mode (default: true)
- `BROWSER_TIMEOUT`: Browser timeout in milliseconds (default: 30000)
- `MAX_CONCURRENT_SCREENSHOTS`: Maximum concurrent screenshots (default: 5)
## Available MCP Tools
### 1. `capture_screenshot`
Capture a full-page screenshot of a webpage with advanced options.
**Parameters:**
- `url` (required): The URL of the webpage to screenshot
- `viewport` (optional): Viewport configuration
- `preset`: Device preset (mobile, tablet, desktop)
- `width`: Viewport width in pixels
- `height`: Viewport height in pixels
- `deviceScaleFactor`: Device scale factor
- `isMobile`: Whether to emulate mobile device
- `hasTouch`: Whether device has touch support
- `waitFor` (optional): Wait condition before taking screenshot
- `type`: Type of wait condition (selector, function, timeout, networkidle)
- `value`: Value for wait condition
- `timeout`: Timeout in milliseconds
- `idleTime`: Network idle time in milliseconds
- `standardDelay` (optional): Apply standard 2.5s delay after networkidle2 (default: true)
- `delay` (optional): Additional delay in milliseconds
- `waitUntil` (optional): When to consider navigation complete (default: networkidle2)
### 2. `capture_element`
Capture a screenshot of a specific element on a webpage.
**Parameters:**
- `url` (required): The URL of the webpage
- `selector` (required): CSS selector for the element to capture
- `viewport` (optional): Viewport configuration
- `standardDelay` (optional): Apply standard 2.5s delay (default: true)
### 3. `list_device_presets`
List available device presets with their configurations.
**No parameters required.**
## Usage with MCP Clients
### Claude Desktop
Add to your Claude Desktop MCP configuration:
```json
{
"mcpServers": {
"screenshot": {
"command": "npx",
"args": [
"-y",
"supergateway",
"--sse",
"http://localhost:3000/sse"
]
}
}
}
```
### Remote Access
To expose your screenshot server publicly, use [ngrok](https://ngrok.com/):
```bash
# Terminal 1: Start the screenshot server
npm start
# Terminal 2: Expose via ngrok
ngrok http 3000
```
Then use the ngrok URL in your MCP client configuration:
```json
{
"mcpServers": {
"screenshot": {
"command": "npx",
"args": [
"-y",
"supergateway",
"--sse",
"https://your-ngrok-url.ngrok-free.app/sse"
]
}
}
}
```
## Deployment
### Standard Deployment
1. Clone this repository
2. Install dependencies: `npm install`
3. Build the project: `npm run build`
4. Set environment variables (create `.env` from `.env.example`)
5. Start the server: `npm start`
### Docker Deployment
Create a `Dockerfile`:
```dockerfile
FROM node:18
# Install dependencies for Puppeteer headless Chrome
RUN apt-get update && apt-get install -y \
chromium \
chromium-sandbox \
fonts-liberation \
libappindicator3-1 \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libcups2 \
libdbus-1-3 \
libgdk-pixbuf2.0-0 \
libnspr4 \
libnss3 \
libx11-xcb1 \
libxcomposite1 \
libxdamage1 \
libxrandr2 \
xdg-utils \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy package files
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy source code
COPY . .
# Build TypeScript
RUN npm run build
# Set environment variables for headless Chrome
ENV PUPPETEER_SKIP_DOWNLOAD=true
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
ENV BROWSER_HEADLESS=true
EXPOSE 3000
CMD ["npm", "start"]
```
Build and run:
```bash
docker build -t screenshot-mcp-gateway .
docker run -p 3000:3000 screenshot-mcp-gateway
```
### Headless Server Requirements
For headless server deployments (Ubuntu/Debian):
```bash
# Install Chrome dependencies
sudo apt-get update
sudo apt-get install -y \
chromium-browser \
chromium-codecs-ffmpeg \
fonts-liberation \
libappindicator3-1 \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libcups2 \
libdbus-1-3 \
libgdk-pixbuf2.0-0 \
libnspr4 \
libnss3 \
libx11-xcb1 \
libxcomposite1 \
libxdamage1 \
libxrandr2 \
xdg-utils
```
## Development
### Build
```bash
npm run build
```
### Development Mode (with auto-reload)
```bash
npm run dev
```
### Clean Build Artifacts
```bash
npm run clean
```
## Architecture
This project combines:
- **Screenshot MCP Server**: Provides screenshot capture functionality using Puppeteer
- **Supergateway Pattern**: HTTP/SSE transport layer for remote MCP access
- **Express.js**: Web server framework
- **MCP SDK**: Official Model Context Protocol SDK
- **Puppeteer**: Headless Chrome automation
## Security Considerations
- The server is exposed on the network when running in HTTP mode
- Consider implementing authentication for production deployments
- Use environment variables for sensitive configuration
- Implement rate limiting for production use
- Be cautious with URL inputs to prevent SSRF attacks
## Troubleshooting
### Chrome Installation Issues
If Chrome fails to install automatically:
```bash
npx puppeteer browsers install chrome
```
### Headless Mode Issues
If screenshots fail in headless mode, try:
1. Set `BROWSER_HEADLESS=false` for debugging
2. Check Chrome dependencies are installed
3. Verify Chrome executable path
### Connection Issues
- Ensure the port is not already in use
- Check firewall settings for the specified port
- Verify CORS settings if accessing from web clients
## License
MIT
## Credits
This project integrates:
- [HTTP-ScreenShotMCP](https://github.com/davinoishi/HTTP-ScreenShotMCP)
- [Supergateway](https://github.com/supercorp-ai/supergateway)
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues