Screen Observer MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Screen Observer MCPstart observing my screen and wait until the build terminal shows Build successful"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Screen Observer MCP
Give your AI agent eyes on the Windows desktop β without giving up privacy.
A local, read-only MCP server that exposes your screen as a bounded, privacy-filtered JSON state, plus optional on-demand screenshots. Built for Claude Code and any other MCP-compatible client.
β¨ Why Screen Observer MCP?
Most AI agents are blind. They can't tell whether your build just finished, whether a dialog is blocking your script, or what window is currently focused. Screen Observer MCP fixes that by giving the agent a structured, queryable, bounded view of your screen:
JSON-first. The agent sees a semantic screen state β active window, focused element, UI tree, change summary β not an opaque pixel stream.
Privacy by default. Password fields, sensitive titles, and configurable regions are redacted in source coordinates before any image is encoded. Nothing is written to disk.
Agent-explicit. The agent decides when to start and stop observation. No background daemons, no cross-process IPC, no surprises.
Event-driven waits. Block on
wait_for_title("Build successful")orwait_for_idle(3000)instead of polling the model.Bounded memory. Frames live in a ring buffer (
RING_DEFAULT_FRAMES,MAX_RING_BYTES). Stop wipes everything in RAM.
Related MCP server: blade-computer-use
π Quickstart
1. Install (editable, dev)
py -3.12 -m venv .venv
.venv\Scripts\python -m pip install -e ".[dev]"2. Run the MCP server
.venv\Scripts\screen-observer mcp3. Wire it into Claude Code
Add to your Claude Code MCP config (%APPDATA%\Claude\claude_desktop_config.json or .mcp.json):
{
"mcpServers": {
"screen-observer": {
"command": ".venv\\Scripts\\screen-observer.exe",
"args": ["mcp"]
}
}
}Or use the prebuilt onedir artifact:
{
"mcpServers": {
"screen-observer": {
"command": "C:\\path\\to\\dist\\screen-observer\\screen-observer.exe",
"args": ["mcp"]
}
}
}The packaged executable depends on its
_internal\directory β copy the wholedist\screen-observer\folder, not just the.exe.
π§° The 10 MCP Tools
Tool | What it does |
| Begin an observation session. Synchronously publishes the first redacted frame, returns |
| End the session. Joins the collector, clears every in-memory frame and current state. Returns a |
| Current screen state β geometry, active window, focused element, UI tree, change summary. JSON by default; pass |
| Block until the published revision advances, or the timeout fires. |
| Block until the active window title contains a substring. Example: |
| Block until the screen stops changing for N ms β perfect for "is the task done yet?" without knowing the marker text. |
| Bounded UI Automation snapshot for a target element and depth. |
| One physical-pixel region as an in-memory Base64 PNG. No file is written. |
| Pull up to N recent redacted frames from the in-memory ring. |
| Pull one specific redacted frame by |
The lifecycle contract
start βββΊ read (loop, with wait_for_change/title/idle) βββΊ stopBefore
startand afterstop, every read tool returns the structuredobserver_not_startederror.stopis the data boundary β it clears all published frame/state artifacts immediately. Nothing is persisted to disk.JSON paths carry everything a text-only client needs. PNG paths require a multimodal/vision-capable client to interpret the rendered pixels.
π¬ Three agent patterns
1. Explicit polling β the agent drives every step
screen_observe_start # ready=true, firstRevision, capabilities, firstFrame
loop:
screen_wait_for_change(since_revision, timeout_ms = 5000)
inspect state β decide whether the task is done
screen_observe_stop # summary carries session countersUse this when the agent knows exactly which UI element to inspect.
2. Wait for a title substring β let the server block
screen_observe_start
screen_wait_for_title(
title_contains = "Build successful",
since_revision = <firstRevision>,
timeout_ms = 120000)
# matched=true β matchedAtRevision, observedTitle
screen_observe_stopPerfect for npm run build / pytest / cargo test terminals.
3. Wait for screen idle β completion by silence
screen_observe_start
screen_wait_for_idle(idle_ms = 3000, since_revision = <firstRevision>, timeout_ms = 120000)
# idleReached=true β idleMs, lastObservedRevision
screen_observe_stopFor tasks that finish without a recognizable title.
π PowerShell wrapper
For humans and one-shot scripts:
# Block until the terminal shows "Build successful":
scripts\observe-until.ps1 -WaitForTitle 'Build successful' -TimeoutSec 180
# Block until the screen stops changing for 3 s:
scripts\observe-until.ps1 -WaitForIdleMs 3000 -TimeoutSec 60The script writes the start/stop summary to the pipeline and exits non-zero on timeout.
π Privacy & data lifecycle
We take this seriously, because screens leak.
In-memory only. Screenshots, videos, and history are not written to disk by the application. Frames live in a bounded ring buffer (
MAX_RING_FRAMES,MAX_RING_BYTESinsrc/screen_observer/domain/limits.py).Opt-in images.
include_image=trueis the only path that ever encodes PNG. JSON-only clients never see pixels.Source-coordinate redaction. Password element names and values are scrubbed. Configured process, title, and physical-pixel regions are redacted before resize and PNG encoding.
No leaked telemetry. Base64 image data and full UI text dumps are never written to diagnostic logs.
Stop is the data boundary.
screen_observe_stopclears every published artifact immediately.Honest disclaimer. The application cannot guarantee that Windows will never page process memory to disk.
ποΈ Architecture
DXGI Desktop Duplication (dxcam)
β
ChangeDetector + RingBuffer (in-memory, bounded)
β
StateService (single source of truth)
β
ββββββββββββββββ ββββββββββββββββββ
β CLI adapter β β MCP stdio β β FastMCP, 10 tools
β (humans) β β (agents) β
ββββββββββββββββ ββββββββββββββββββCapture backend: DXGI Desktop Duplication (
dxcam) on Windows 11;mssinjectable for synthetic tests. The PyInstalleronedirbuild mustcollect_all("dxcam")to bundle the native DXGI/D3D11 binaries.Privacy filter: runs before resize/encode.
One process for now. Capture + state + MCP server live in the same process to keep deployment simple. The MCP layer is the only public interface β agents never touch internal services directly.
JSON-only by default. The MCP protocol reserves
stdout; diagnostics go tostderr; tool handlers return structured safe errors instead of Python tracebacks.
π¦ Build a portable Windows package
# Build the onedir artifact:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\build_windows.ps1
# Smoke test the packaged CLI/MCP:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\smoke_packaged.ps1Artifact lands at dist\screen-observer\screen-observer.exe plus its _internal\ folder.
A onefile package has not been built or validated β stick with onedir for now.
π οΈ Development
# Run the full test suite:
.venv\Scripts\python -m pytest -q
# Lint:
.venv\Scripts\python -m ruff check src tests
# Strict type check:
.venv\Scripts\python -m mypy
# Dependency sanity:
.venv\Scripts\python -m pip checkTest entry points:
tests/adapters/test_windows_integration.pyβ Windows capture / UIA / window adapter integration.tests/interfaces/test_mcp_server.pyβ stdio protocol and tool contracts.tests/integration/test_packaged_smoke.pyβ packagedonedirartifact smoke (gated bySCREEN_OBSERVER_PACKAGED_TEST=1).
Project layout
src/screen_observer/
βββ adapters/ # DXGI / Windows / UIA / fake capture backends
βββ domain/ # Pure models, limits, errors, privacy rules
βββ services/ # StateService, ChangeDetector, RingBuffer, ImageEncoder
βββ interfaces/ # CLI adapter, MCP stdio server
βββ main.py # Entry pointπΊοΈ When to use Screen Observer MCP
β Great fit
Driving CI / build / test runs from an agent and waiting for completion.
Verifying desktop app behavior after a script change (does the dialog appear? did the window move?).
Capturing screenshots of the current UI for a vision-capable agent to interpret.
Building automation that needs to know the active window before clicking.
β οΈ Not a fit
30/60 FPS video analysis β this is stateful, not streaming.
Remote screen sharing β strictly local, no network surface.
Mouse/keyboard automation in v1 β coming later; see open issues.
Cross-platform β Windows 11 only for real capture (the interfaces are platform-neutral for testing).
π€ Contributing
Issues and PRs welcome. Before opening a PR:
Run
pytest,ruff check, andmypyβ all must pass.Add or update tests for any behavioral change.
Keep MCP tool contracts backward-compatible (additive only).
π License
Apache License 2.0 β Copyright Β© 2026 Aura.
You may use, modify, and distribute this project (including for commercial purposes) under the terms of the Apache License, Version 2.0. A copy of the license is included in this repository at LICENSE.
π Acknowledgments
Model Context Protocol β the transport that makes this possible.
dxcam β clean DXGI Desktop Duplication bindings.
pywinauto β UI Automation access.
FastMCP β the MCP Python SDK.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityAmaintenanceAllows AI clients to see and control Windows 10/11 desktops via MCP, with screenshots, UI Automation, Chrome CDP, keyboard/mouse, and terminal using semantic element targeting.301,255MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to control macOS via accessibility and screen recording, providing tools to list apps, observe UI, click, type, press keys, and scroll.MIT
- AlicenseNot gradedqualityBmaintenanceProvides screenshot capture and vision analysis tools that enable AI to see and analyze screen content on Windows, forming an automated capture-analyze pipeline.1MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that captures a Windows application's pixels and bounded UI Automation tree with provider-exposed text for Codex inspection. It supports capture, listing, retrieval, and watcher control commands.MIT
Related MCP Connectors
Eyes and hands on real Windows PCs β observe, click, type via Glasswarp API.
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/wuhaostudio/screen-observer-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server