
Open Eagle Eye
io.github.stuchapin909Published by GitHub account stuchapin909v8.0.0Updated Oct 27, 2026
Live snapshots from ~29,000 public cameras across 11 countries — traffic, weather, webcams
Overview
Lets an assistant browse a registry of public traffic, weather and web cameras and fetch live JPEG/PNG snapshots saved to local disk.
- What you can do
- Browse and search the camera registry by city, location, category or name
- Fetch a live snapshot from a camera, saved to disk with the file path returned
- Manage a local collection of cameras: add, list, remove and submit them upstream
- Report broken or low-quality cameras and check API key configuration status
- When to use it
- Useful when you want an assistant to pull current visual context from public traffic, weather, highway or city cameras, or to keep your own list of direct-image camera URLs for repeated snapshots.
- Requirements
- Runs locally as an npm package (npx or global install) over stdio; needs Node.js and network access to fetch the registry from GitHub on start and to reach camera hosts. Optional API keys for some cameras go in a config file under the user's home directory. Sharing local cameras upstream requires the gh CLI to be authenticated.
Installation
In SourceWeft
- Open Open Eagle Eye in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Open Eagle Eye
MCP server that gives AI agents instant access to public camera feeds worldwide. One HTTP GET, sub-second captures, no browser automation, no stream decoding.
Why
Most camera APIs require authentication, serve video streams, or hide images behind JavaScript rendering. Open Eagle Eye only indexes cameras that return a JPEG or PNG on a plain HTTP GET — the simplest possible integration. Agents don't need to render pages or decode video. They just fetch an image.
The registry is self-healing. A GitHub Action runs nightly, checks every camera, retries failures before removing them, and uses vision AI to catch cameras that return error pages instead of live feeds. Dead cameras get flagged automatically.
Quick start
Or install globally:
On first run, the server fetches the latest camera registry from GitHub and caches it locally in ~/.openeagleeye/. Subsequent starts refresh the cache automatically.
How it works
A valid camera URL is any endpoint that returns a JPEG or PNG on a plain HTTP GET. Most city traffic cameras, weather stations, and park cams expose exactly this. The server fetches the image, saves it to disk, and returns the file path.
MCP Tools
Upstream vs local cameras
The registry has two layers:
- Upstream — the global registry fetched from GitHub on every server start. These are the ~32,000 validated public cameras.
- Local — cameras you add yourself via
add_local_camera. They persist in~/.openeagleeye/local-cameras.json, survive restarts, and appear inlist_cameras/search_cameraswithsource: "local". Share them upstream anytime withsubmit_local.
Filtering
Every camera has a city field. Use list_cameras with city: "Sydney" to get a short, focused list instead of dumping all cameras into context.
Output format
Every tool returns structured JSON. Snapshots save to disk and return the file path — the MCP server runs as a local subprocess, so the agent has filesystem access.
Snapshot response:
Registry
~32,000 cameras across eleven countries (32,096 verified):
Every camera has country, city, location, timezone, and coordinates (lat/lng).
Self-healing
A GitHub Action runs nightly at 3 AM UTC:
- Checks cameras not validated in the last 7 days, plus any flagged as suspect
- First failure marks as suspect, second consecutive failure removes and opens a GitHub issue
- Vision AI (GPT-4o-mini via GitHub Models) catches cameras returning error pages
- Suspect cameras that recover are cleared automatically
Security
- SSRF protection — blocks private IPs, cloud metadata endpoints, non-HTTP protocols, and DNS rebinding
- Content-type whitelist — only
image/jpegandimage/pngaccepted - Magic byte detection — validates JPEG/PNG by file header when CDN returns wrong content-type
- Push/PR cap — max 500 cameras per push to prevent DoS via oversized PRs
- Random filenames — snapshots use random hex filenames, no camera ID in the path
API Keys (optional)
Most cameras work out of the box. Some require a free API key. If a snapshot fails with a key error, the response tells you where to sign up and how to configure it.
Create ~/.openeagleeye/config.json:
Use check_config to see which cameras need keys and whether yours are set.
Adding cameras
- Find a direct-image URL (must return
image/jpegorimage/pngon plain GET) add_local_camerawith the URL, city, location, timezone, and optional coordinatesget_snapshotto test itsubmit_localto share upstream — requires theghCLI (gh auth login)
Local cameras work immediately and don't need upstream approval to be useful.
Good sources: city DOTs, weather stations, ski resorts, national parks, ports, airports.
File layout
All runtime data lives in ~/.openeagleeye/:
Contributing
Pull requests welcome. See CONTRIBUTING.md for guidelines on adding camera sources.
Why this exists
See WHY.md for the reasoning behind the project's design decisions, how it compares to other camera services, and why agent-native and self-healing matter.
Privacy & security
See SECURITY.md for answers to common questions about surveillance, data collection, private cameras, and the security architecture.
License
MIT
Source: README.md at commit 62654d5
Tools
0Version history
1- v8.0.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts