MCP server for darktable photo management with headless library operations
darktable-mcp has 9 tools with complete input schemas and descriptions, but quality is uneven. Tool names follow verb_noun convention (import_from_camera, get_contact_sheet, extract_preview). Descriptions are present but brief (avg ~80 chars, below the 194-char baseline). Parameters have types and descriptions, but lack constraints (enums, ranges, patterns). No output schemas documented. Error handling is minimal, tools return raw exceptions rather than actionable recovery guidance. Security: tools accept file paths as parameters without visible sanitization against path traversal. Composition is reasonable (single responsibility per tool), but no pagination guidance for list-returning tools.
Extract previews from multiple raw files in parallel
Compose aspect-preserving BGR previews with labels and error cells for LUT comparison
Extract auto-rotated preview from a raw photo file
Generate a grid-of-thumbnails view over the current darktable collection for fast batch visual culling
Import photos from a connected camera via gphoto2 (libgphoto2)
Apply ratings via XMP sidecars to raw files before import into darktable
Return a regular LUT file confined to the configured root
No output schemas documented. LLMs cannot predict response structure or plan downstream tool calls. E.g., get_contact_sheet returns a grid image but no schema describes dimensions, format, or metadata fields.
File path parameters (destination, root_dir, image_path, source_dir) lack path traversal validation or constraints. No mention of symlink handling, absolute vs relative paths, or sandboxing. Agents could be tricked into writing outside intended directories.
Descriptions are too brief (avg 60 chars vs 194-char baseline). Missing context on WHEN to use each tool, prerequisites, and side effects. E.g., 'rate_raws' does not explain that it modifies XMP sidecars or whether it requires darktable to be running.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Invoke the MODNet matting sidecar to produce a 16-bit grayscale PNG alpha matte
List supported LUT files in a directory without following escaped symlinks
No enum constraints on string parameters. 'filter' in get_contact_sheet lists valid values in description ('all, unrated, rated, rejected, selected') but not as JSON Schema enum. LLMs may hallucinate invalid values.
No error handling guidance. Tools return raw exceptions without recovery hints. E.g., if import_from_camera fails due to missing camera, the LLM receives no suggestion to check gphoto2 or retry with different parameters.