MCP server giving AI agents access to live camera screenshots from around the world
WorldCam MCP demonstrates solid definition quality with well-named tools, clear descriptions, and proper input schemas. All 6 tools have explicit registrations with names, descriptions, and Zod schemas. Naming follows verb_noun convention (get_*, search_*, find_*, list_*). Descriptions are concise and action-oriented (avg ~140 chars). Schemas use Zod with proper type definitions, min/max bounds, and optional markers. However, there are moderate gaps: (1) Output schemas are not formally documented, responses are returned as JSON text within MCP ContentBlock, making the structure implicit rather than explicit; (2) Tool descriptions lack dependency hints and error recovery guidance; (3) Parameter descriptions are functional but minimal, lacking format details and examples of valid values; (4) No error categorization or recovery guidance in error responses. The server handles input validation (path traversal, source validation) and returns structured JSON, which is good practice. Overall, this is a B-grade server, functional and well-organized, but missing production-grade polish in schema documentation and error handling guidance.
Find the closest live cameras to a GPS coordinate. Returns cameras sorted by distance. Only cameras with known coordinates are included.
Capture a live screenshot from a specific camera. Returns the image as base64 with weather context (temperature, conditions, day/night, local time). Use search_cameras first to find camera IDs.
Detect the current geographic location. On macOS uses CoreLocation (WiFi-based, ~35m accuracy). Falls back to IP geolocation on other platforms. Use the returned coordinates with find_nearest_camera.
Get a live screenshot from a random camera with weather context. Optionally filter by country or category.
List all camera data sources and their availability, camera counts, and whether they require API keys.
Search for live cameras around the world by location, category, or source. Returns a list of cameras with metadata (no screenshots).
Output schemas are not formally documented. Tool responses are returned as JSON text within MCP ContentBlock structure, but the shape of that JSON (field names, types, nested structures) is never explicitly declared. LLMs and downstream tooling cannot validate or rely on response structure.
Parameter descriptions lack actionable detail. For example, 'category' and 'source' parameters reference CATEGORIES and SOURCE_NAMES constants in descriptions ('Camera category: ...'), but these are referenced as strings without explicit enumeration of valid values in the description text. LLMs may hallucinate invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 63 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Error messages are generic and lack recovery guidance. Error responses return 'Error: <message>' wrapped in isError=true, but do not categorize errors (retryable vs. user-fixable) or suggest next steps. Example: a 'camera not found' error should suggest 'Try search_cameras() to find available cameras.'
Tool descriptions do not include dependency hints. For example, get_camera_screenshot says 'Use search_cameras first to find camera IDs', but find_nearest_camera and get_random_camera do not hint at the relationship to get_current_location. Multi-step workflows are not documented.
Parameter 'camera_id' format is documented as 'source:nativeId' with examples ('youtube:1-iS7LArMPA', 'windy:1179853135'), but this is informal. No regex pattern or strict validation is declared in the schema, leaving room for LLM misinterpretation.