Merge
MCP tools for HDR, panorama and HDR panorama merges.
merge_photos
Section titled “merge_photos”Merge to HDR or panorama. Merge groups of RAW photos to HDR, panorama or HDR panorama, one group after another, as Image › Merge does: each result is a new EXR photo stacked on its photos, in their collections, starting from the reference photo’s edits. Each merge takes about a minute or more. Remove from Catalog takes a result out; its file stays. Returns a job: follow it with get_jobs; a group that fails is listed and the others go on.
Bridge method: merge.start
| Parameter | Type | Required | Details |
|---|---|---|---|
groups |
array of object | yes | The merges: each group’s photo ids, in order (an hdr_pano group holds every bracket of the panorama). Not empty, at most 100 items. |
kind |
string | yes | One of hdr, pano, hdr_pano. |
settings |
object | The merge window’s settings by name; left out, DarkRay’s merge preferences and the window’s defaults. Each kind takes only its own. Fields: reference, wb_photo, align, deghost, bracket_size, projection, yaw, pitch, roll, auto_crop, boundary_warp, gain_compensation, seams, lens_override, stack. |
|
catalog |
string | A catalog from list_catalogs; omitted, the one DarkRay shows. |
Python: app.merge_photos(…)
from darkray_bridge import DarkRay
with DarkRay.connect() as app: ids = [photo.id for photo in app.iter_photos("type:raw date:2026-08-21")] brackets = app.find_brackets(ids)["brackets"]
# One HDR merge per bracket, one after another. Each takes a minute or more. job = app.merge_photos([{"ids": b["ids"]} for b in brackets], kind="hdr", settings={"deghost": "medium", "stack": True}) job.wait(progress=lambda j: print(f"merged {j.done} of {j.total}"))
for merged in job.result["merged"]: print(merged["id"], merged["file"]) for failed in job.result["failed"]: print(f"group {failed['group']} failed: {failed['reason']}")