MCP server exposing the osxphotos CLI as tools for LLMs
This server has a single tool 'batch_edit_by_uuid' with an extremely complex parameter surface (104 parameters). While the schema is technically present and mostly well-typed, the tool suffers from severe design issues: (1) The tool name is a verb+noun but combines multiple responsibilities, filtering, metadata manipulation, template rendering, and exiftool invocation, into one monolithic operation. (2) The description is a bare 140 characters and lacks guidance on WHEN to use this vs. simpler tools. (3) Most critically, the parameter set violates single-responsibility principle: the tool accepts filtering parameters (keyword, person, album, folder, name, uuid, date ranges, photo types), metadata editing parameters (title, description, place, location), exiftool options, keyword templating, and report generation in ONE tool. This forces the LLM to reason about 104 options simultaneously, which degrades planning. (4) Many parameters lack detailed descriptions explaining their semantic meaning, e.g., 'metadata': 'Metadata to update' is circular and doesn't explain what metadata values are valid. (5) No output schema is documented; the tool returns a string 'Report format' but what fields/structure does that contain? (6) Mutation semantics are unclear: does this tool actually mutate the Photos library, or just generate a report? The 'push_edited' and 'dry_run' flags hint at mutations, but the tool description does not explicitly state 'WARNING: this modifies your Photos library.' (7) No error recovery guidance, if exiftool is missing, the tool likely fails hard with a cryptic subprocess error. (8) Filtering parameters are boolean flags ('favorite', 'not_favorite', 'hidden', 'not_hidden', 'burst', 'not_burst'), LLMs frequently struggle with negative-form boolean flags and often pass both 'favorite=true' and 'not_favorite=true' simultaneously, which is ambiguous. This server would benefit from splitting into focused tools: list_photos_by_filter, edit_photo_metadata, apply_exiftool_tags, generate_photo_report.
Batch edit photos by UUID with extensive filtering and metadata manipulation options
Single monolithic tool combines filtering, editing, templating, and exiftool invocation. Violates single-responsibility principle. Tool name 'batch_edit_by_uuid' does not convey filtering, templating, or report generation.
Tool description is only 140 characters and lacks context: does NOT state whether this mutates the Photos library (destructive operation), what report format looks like, when to use this vs. alternatives, or prerequisites (e.g., osxphotos CLI installed). LLMs cannot determine tool selection intent from this.
104 parameter surface with many ambiguous or under-described parameters: 'metadata' parameter description is circular ('Metadata to update' without explaining valid keys). Boolean flag parameters use negative forms ('not_favorite', 'not_hidden') which LLMs often misuse by passing both inclusive and exclusive forms simultaneously.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 32 | 2026-07-28+ | v2 |
No documented output schema. Tool accepts 'report' parameter but description does not explain what report format is returned (structured object? string? CSV?), what fields it contains, or how to parse it. LLMs cannot plan downstream actions without output schema.
Destructive operation (modifies Photos library) but description does NOT explicitly warn of this. No dry-run confirmation pattern documented. Flags 'dry_run' and 'push_edited' exist but are buried in a sea of 104 parameters and lack clear guidance on their safety implications.
Error handling is minimal. Tool invokes external subprocess (osxphotos CLI, exiftool) but has no documented error recovery: if exiftool is missing, osxphotos binary is not in PATH, or Photos library is locked, what does the agent do? No recovery guidance provided.
Parameter dependencies are undocumented. E.g., 'keyword_template' depends on 'replace_keywords' and 'append' flags, but no description states this mutual exclusivity or guidance. 'exiftool_option' is only valid if 'exiftool_path' is set, but this constraint is silent. LLMs will pass incompatible combinations.
Many parameters lack type-specific guidance in descriptions. 'from_date' and 'to_date' accept strings but no format specified (ISO 8601? natural language? 'YYYY-MM-DD'?). 'year' accepts integer array but min/max bounds are not documented. LLMs will pass invalid formats.