The quickest documented route is Microsoft’s Playwright MCP image. Run it as a persistent container on port 8931, then point your MCP client at http://localhost:8931/mcp. If you would rather have a small, screenshot-focused server, there is a separate Python project you can build and run with Docker. The two are different projects with different commands, ports and capabilities, so they are not interchangeable. The commands below come from each project’s README. Check the upstream README and image tag before you run anything, because both can change.
Pick a transport first: stdio or HTTP
Which command you run depends on how your MCP client talks to the server.
As an Amazon Associate I earn from qualifying purchases.
- stdio: the MCP client launches the container itself with
docker run -iand talks over standard input and output. Nothing stays running when the client closes, and you publish no port. - HTTP: you start a container that stays up on its own, publish a port, and the client connects to a URL. Use this when the server should outlive the client or be shared by several clients. Your client must support URL-based (streamable HTTP) servers.
Before you start, install Docker and confirm that docker run hello-world works.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Option 1: Microsoft Playwright MCP in a persistent container
The microsoft/playwright-mcp README documents both modes. It also states: “The Docker implementation only supports headless chromium at the moment.” Expect headless Chromium only. Firefox, WebKit and headed mode are not available in the container.
#1 Best Overall
- Includes Raspberry Pi 5 with 2.4Ghz 64-bit quad-core CPU (8GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
Start the HTTP server
docker run -d -i --rm --init --pull=always
--entrypoint node
--name playwright
-p 8931:8931
mcr.microsoft.com/playwright/mcp
/app/cli.js --headless --browser chromium --no-sandbox --port 8931 --host 0.0.0.0
What the flags do:
-druns it in the background;--name playwrightlets you manage it withdocker logs playwrightanddocker stop playwright.--rmdeletes the container when it stops.--pull=alwaysfetches the image each time, so you get whatever the tag currently points to. The README does not give a validated version to pin. If you need reproducibility, test a specific image tag or digest yourself and pin that.-p 8931:8931publishes the port, and--host 0.0.0.0makes the server listen on all interfaces inside the container so the published port works.--no-sandboxis part of the documented command for running Chromium in the container.
Connect your MCP client
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/mcp"
}
}
}
Or let the client launch the container (stdio)
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "--pull=always", "mcr.microsoft.com/playwright/mcp"]
}
}
}
Taking and saving screenshots
The screenshot tool is browser_take_screenshot. Its optional filename saves the image under that name. Without one, the server writes a timestamped file to its output directory. According to the README, a filename resolves against the workspace root or the output directory depending on whether you supplied one explicitly. Inside Docker, those paths are inside the container. If you want files on your host, mount a host directory and set the output directory to it. The README excerpt I worked from does not give a ready-made mount recipe, so check the current options list for the output-directory flag before relying on it.
Option 2: A dedicated screenshot server (mcp-screenshot-server)
The aamar-shahzad/mcp-screenshot-server project is a separate Python MCP server. You build the image yourself from the repository:
Rank #2
- Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM)
- Includes Pre-Loaded 32GB EVO+ Micro SD Card (Class 10), USB MicroSD Card Reader
- CanaKit Premium High-Gloss Raspberry Pi 4 Case with Integrated Fan Mount, CanaKit Low Noise Bearing System Fan
- CanaKit 3.5A USB-C Raspberry Pi 4 Power Supply (US Plug) with Noise Filter, Set of Heat Sinks, Display Cable - 6 foot (Supports up to 4K60p)
- CanaKit USB-C PiSwitch (On/Off Power Switch for Raspberry Pi 4)
docker build -t mcp-screenshot-server .
stdio
docker run -i --rm mcp-screenshot-server
Streamable HTTP
docker run -p 8000:8000 mcp-screenshot-server
--transport streamable-http --port 8000
The README’s Cursor example uses the endpoint http://localhost:8000/mcp. Host and port can also be set with MCP_HOST (default 0.0.0.0) and MCP_PORT (default 8000). The project also documents an SSE transport. Not every client supports every transport, so match the transport to your client’s documentation.
Get screenshot files onto your host
mkdir -p screenshots
docker run -p 8000:8000
-v "$(pwd)/screenshots:/app/screenshots"
mcp-screenshot-server --transport streamable-http
Files the server writes to /app/screenshots then appear in ./screenshots on your machine. That path is specific to this project.
Web page or desktop: do not mix them up
A headless browser in a container renders web pages. It cannot see your desktop. The mcp-screenshot-server README warns that in Docker the container runs headless and screen capture may come out blank, and says capturing the real screen requires running the server natively on the host. If you want pictures of websites, Docker is fine. If you want your actual screen, run the server outside Docker.
Option 3: A local screenshot API with an MCP interface
The mcp-server-screenshot PyPI page describes a REST API and MCP server built on Playwright with a pooled Chromium browser. Its quick start is docker-compose up -d, which serves at http://localhost:8500. The screenshot endpoint supports viewport size, full-page mode, PNG, JPEG or PDF output, waiting for a CSS selector and an optional delay. The page content I reviewed does not include a complete recipe for connecting it to an MCP client, so treat it as an option for people who want a local screenshot API, not a copy-paste MCP setup.
Rank #4
- Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1. 5GHz
- 2. 4 GHz and 5. 0 GHz IEEE 802. 11b/g/n/ac wireless LAN, Bluetooth 5. 0, BLE
- 2 × USB 3. 0 ports, 2 x USB 2. 0 Ports
- 2 × micro HDMI ports supproting up to 4Kp60 video resolution
- Micro SD card slot for loading operating system and data storage
A hosted container alternative
Docker’s MCP Catalog lists a Browserbase MCP server described as a containerized server for remote browser automation and screenshot capture. It needs secrets, including Browserbase credentials, and lists six tools. The browser sessions run remotely rather than on your machine. The catalog page does not state pricing or terms.
Comparison
| Aspect | Playwright MCP | mcp-screenshot-server | mcp-server-screenshot |
|---|---|---|---|
| How you get it | Published image mcr.microsoft.com/playwright/mcp |
Build from the repository | Docker Compose quick start |
| HTTP port | 8931 (/mcp) |
8000 (/mcp) |
8500 (REST API) |
| stdio | Yes, client-launched | Yes | Not stated on the page reviewed |
| Browser | Headless Chromium only in Docker | Headless in Docker; no real desktop capture | Pooled Chromium via Playwright |
| Host file output | Output directory in the container; mount recipe not shown in the excerpt reviewed | Mount /app/screenshots |
Not stated |
Security: keep it local
The Playwright MCP README says the server is not a security boundary. None of the pages reviewed document authentication, TLS or a safe way to expose these HTTP servers publicly. As a cautious inference, not something the projects state: keep these containers on your own machine or a trusted network. For example, publish to loopback only with -p 127.0.0.1:8931:8931. Read the project’s current security guidance before making it reachable from elsewhere. A browser that fetches arbitrary URLs can also reach services on your internal network, so be careful what it can access.
Best Value
- Includes Raspberry Pi 5 16GB with 2.4Ghz 64-bit quad-core CPU (16GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Client cannot connect to localhost:8931 |
Port not published, container exited, or server bound to the container’s loopback | Check docker ps and docker logs playwright; keep -p 8931:8931 and --host 0.0.0.0 |
| Client says the URL or transport is unsupported | Client only supports stdio or a different HTTP transport | Switch to the stdio config, or use the transport your client documents |
| Port already allocated | Something else is using it, or an old container | docker rm -f playwright, or map another host port such as -p 9000:8931 and update the URL |
| Screenshot saved but not found on the host | File was written inside the container | Mount a volume (/app/screenshots for mcp-screenshot-server) or copy it out with docker cp |
| Blank image of a desktop | Headless container has no real screen | Run the screenshot server natively for desktop capture |
| Firefox or headed mode fails | Docker image supports headless Chromium only | Run Playwright MCP natively on the host |
| Image changed behavior after a restart | --pull=always follows the tag |
Pin a tag or digest you have tested |
Pre-flight checklist
- Transport matches your client (stdio or URL).
- Port is published and the URL ends in
/mcp. - Output directory is mounted if you need files on the host.
- The target is a web page, not the physical desktop.
- The service is not exposed beyond a trusted network.
Or skip the browser setup
If all you need is a clean screenshot of a URL, running and securing a browser container is extra work. ScreenshotNeo is a screenshot API and MCP server: one GET request returns a PNG, JPEG, WebP or PDF. Full parameters are in the docs.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python:
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js:
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
- Cookie banners, newsletter popups and chat widgets are removed before the shot (60+ known consent platforms); each step can be turned off.
- Bot checks, blank pages, timeouts, failed loads and cache hits are never billed, and the
X-Page-VerdictandX-Billedresponse headers tell you which it was. - The MCP server works with Claude, Cursor and other MCP clients, with the tools
take_screenshot,get_page_infoandcapture_pdf. There is no container to run. - Full-page capture, element capture by CSS selector, dark mode, device presets, waiting for a selector or network idle, and caching are all available on every plan.
- 1,000 screenshots a month are free with no card; paid plans start at $5 for 3,000.
Sign up free and take your first screenshot in a minute.
Frequently Asked Questions
Can I use the same Docker container for several MCP clients?
With an HTTP server such as the Playwright MCP container on port 8931, several clients can point at the same URL if they support URL-based servers. Whether sessions are isolated between clients is not documented in the README excerpt reviewed, so test before sharing one instance.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Do I need a GPU or a display for these containers?
The documented setups run a headless browser and need neither. A display is only relevant to desktop capture, which Docker does not do reliably.
How do I stop and remove the Playwright container?
Run docker stop playwright. Because the command includes –rm, the container is deleted when it stops.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




