mcp-photo-edit
An installable MCP server for agent-driven photo editing with RawTherapee.
The server exposes a session-based editing workflow instead of raw sidecar manipulation.
Agents create an edit session, apply structured adjustments, regenerate previews when
needed, and export a final image. Installing mcp-photo-edit installs all Python runtime
dependencies automatically; users only need Python, an MCP client, and RawTherapee.
Each session now also maintains an explicit undo / redo timeline in session.json. Semantic edit history is tracked separately from preview-render history.
Examples
The demo photographs are original work and are not covered by the GPL license. Commercial use is prohibited.
Example: Fujifilm Style (v0.2.0)
Compare the baseline image with the two Fujifilm-style outputs below. Each thumbnail links to the full-size file. One with advanced image info and the other off.
Prompt:
Apply a Fujifilm camera like profile to
demo/cosplay.NEF. Apply a crop to focus on the center but keep the aspect ratio, export the result asdemo/fujifilm_style.jpg
| Before | Preview only | With diagnostics |
|---|---|---|
Model: gemini-3.1-pro-preview
Example: CCD Style (v0.2.0)
This example compares advanced image info-assisted runs using the same source image, prompt but different models.
Prompt:
Apply a 2000s CCD camera like profile to
demo/cosplay.NEF. Apply a crop to focus on the center but keep the aspect ratio, export the result as demo/ccd_style_gpt54_mini_medium.jpg
Main comparison:
| Baseline | Gemini 3 Flash | Gemini 3.1 Pro | GPT-5.4 (Medium) | GPT-5.4 Mini (Medium) |
|---|---|---|---|---|
Models: gemini-3-flash-preview, gemini-3.1-pro-preview, gpt-5.4 (medium), gpt-5.4-mini (medium)
Status
This is an MVP implementation.
Current focus:
- session-based editing flow
- structured adjustment schema
rawtherapee-clipreview and export- RAW and common raster inputs when supported by the local RawTherapee build
Not in scope:
- local masks
- healing / AI retouch
- full photo-editor feature coverage
- large preset libraries
- batch editing UX
Requirements
- Python 3.12+
uvfor the easiest install and run workflow, orpipx- RawTherapee with
rawtherapee-cliavailable onPATH, or an absolute executable path set inRAWTHERAPEE_CLI
Tested Environment
- OS: Windows 11 and Ubuntu 24.04 LTS
- RawTherapee: v5.12 on Windows; v5.10 on Ubuntu
Verify RawTherapee:
rawtherapee-cli -v
On Windows, if RawTherapee is installed but its directory is not on PATH, set the
absolute executable path before starting the MCP client:
$env:RAWTHERAPEE_CLI = "C:\Program Files\RawTherapee\5.12\rawtherapee-cli.exe"
Install
Run the published package without cloning this repository:
uvx mcp-photo-edit
uvx creates and caches an isolated environment. All Python dependencies are resolved
from the package metadata. To install the command persistently instead:
uv tool install mcp-photo-edit
Or use pipx:
pipx install mcp-photo-edit
After a persistent install, the executable is simply mcp-photo-edit.
MCP Quickstart
Example stdio configurations
Codex CLI
Add this block:
[mcp_servers.photo_edit]
command = "uvx"
args = ["mcp-photo-edit"]
[mcp_servers.photo_edit.env]
MCP_PHOTO_EDIT_WORKDIR = "/absolute/path/to/.mcp-photo-edit"
If you prefer to add it from the CLI instead of editing TOML manually:
codex mcp add photo-edit --env MCP_PHOTO_EDIT_WORKDIR=/absolute/path/to/.mcp-photo-edit -- uvx mcp-photo-edit
Verify the server is registered:
codex mcp list
Recommended AGENTS.md snippet for better tool selection:
Use the `photo-edit` MCP server for photo-editing tasks. Create an edit session first, iterate with previews, and export only when the preview looks correct.
Gemini CLI
Add this block:
{
"mcpServers": {
"photo-edit": {
"command": "uvx",
"args": ["mcp-photo-edit"],
"env": {
"MCP_PHOTO_EDIT_WORKDIR": "/absolute/path/to/.mcp-photo-edit"
},
"timeout": 30000,
"trust": true
}
}
}
Or add it from the CLI. This example writes to user config instead of project-local config:
gemini mcp add --scope user --transport stdio --env MCP_PHOTO_EDIT_WORKDIR=/absolute/path/to/.mcp-photo-edit --timeout 30000 --trust photo-edit uvx mcp-photo-edit
If you omit --scope user, Gemini CLI writes the MCP entry to project-local config by default.
Verify the configuration:
gemini mcp list
If Gemini shows the stdio server as disconnected, trust the current folder first:
gemini trust
Compatibility Note
RAW support depends on the local RawTherapee build and its bundled RAW decoders. A file extension being supported in principle does not guarantee that every camera or compression variant will decode on every machine. When diagnosing unsupported RAW files, check the installed RawTherapee version and the camera / compression mode used by the source file. For reference, this project is primarily developed and tested on the environment described in the Tested Environment section.
Note on Nikon RAW: Some compressed Nikon RAW formats (e.g., High Efficiency / HE* compression) may not be supported by the underlying libraries in current RawTherapee builds. If you encounter issues with Nikon files, try using uncompressed RAW or Lossless Compressed modes if available in-camera.
Advanced Image Info
The server can attach structured diagnostics to each preview:
preview_pathremains the primary image for aesthetic judgment.diagnostic_summaryadds machine-readable stats for exposure, balance, and saturation.- Set
DISABLE_ADVANCED_IMAGE_INFO=trueto turn the diagnostics off and keep the original preview-first workflow.
Available Tools
create_edit_sessionget_edit_sessionrender_previewapply_adjustmentsreset_adjustmentsundo_adjustmentredo_adjustmentexport_imagelist_supported_adjustments
render_preview regenerates the current session preview, appends a new preview artifact, and returns the latest preview_count.
undo_adjustment and redo_adjustment move the session cursor across committed edit states without creating new edit-history entries.
Typical Agent Workflow
- Create a session from an input image.
- Inspect the returned session state, including
preview_path,preview_history, current adjustment state, and history cursor fields such ashistory_index,history_length,can_undo, andcan_redo. - Apply one or more adjustments.
- Use
undo_adjustmentorredo_adjustmentwhen you need to move across committed edit steps. - Re-check the preview by calling
render_previewwhenever you want a fresh preview artifact and an explicitpreview_countfor the current step. - Export a final image explicitly.
See SKILL.md for an agent-facing usage guide.
Adjustment Model
The public API exposes a stable edit schema. It does not ask clients to hand-author backend profile files.
Current default-backend MVP adjustments:
exposurecontrastsaturationrgb_mixerdenoise_lumadenoise_detaildenoise_chromacolor_temperaturegreen_balancehighlightsshadowssharpen_amountsharpen_radiussharpen_contrastorientationcrop
Use list_supported_adjustments to discover exact ranges, defaults, and example payloads at runtime.
list_supported_adjustments is the source of truth for the installed renderer's runtime
capabilities.
Session History
session.jsonis the authoritative session timeline.historystores committed semantic edit steps.history_indexpoints to the current step.state.jsonis the current renderer-neutral service request state.render_previewappends preview artifacts but does not append semantic edit history.- Applying a new edit after undo truncates the redo tail.
Project Layout
src/mcp_photo_edit/
interfaces.py Backend protocols
backend.py Local file editing backend
models.py Pydantic schemas and validation
session.py Session lifecycle and persistence
server.py MCP tool registration
tests/
skills/
Development
Install dev dependencies:
uv sync --dev
Run tests:
uv run pytest
Start the server over stdio:
uv run mcp-photo-edit
This repository is self-contained for development. uv sync --dev resolves all declared
Python dependencies automatically.
Disclaimers
- This project invokes
rawtherapee-cli; it does not embed or redistribute RawTherapee internals. - Exact visual behavior depends on the local RawTherapee version, decoder support, ICC setup, and the input file.
- The server never modifies the original source image. It writes session artifacts and backend state files in a managed workspace.
Metadata
Release files for mcp-photo-edit 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mcp_photo_edit-0.3.0.tar.gz | 14.9 MB | With provenance | Details for mcp_photo_edit-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mcp_photo_edit-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for mcp_photo_edit-0.3.0-py3-none-any.whl |
Total release size: 14.9 MB
Release files / mcp_photo_edit-0.3.0.tar.gz
| Download URL | mcp_photo_edit-0.3.0.tar.gz |
|---|---|
| Size | 14.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5686fb338380083f67573f379a509fa433bdf182fe7d684153b04b9fcd3c2218
|
|
BLAKE2b-256 checksum How to use checksums |
7baa1a5abb1cbedb24eb5d62b917e5402afb8c9e81f2aa10a0a3a746ab3cba1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logRelease files / mcp_photo_edit-0.3.0-py3-none-any.whl
| Download URL | mcp_photo_edit-0.3.0-py3-none-any.whl |
|---|---|
| Size | 43.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6d4cdfe5e7559749de1dc13ebd5d55274e677519775474c2a1fe1afaa563dc4c
|
|
BLAKE2b-256 checksum How to use checksums |
028c90f4ea19f7df9683580bca440c97eccefe34bf742653b1587ac0a13091c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logSecurity for mcp-photo-edit 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for mcp_photo_edit-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.