@pired/lightroom-mcp 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/LightroomMCP.lrplugin/HandlerAI.lua +466 -0
- package/dist/LightroomMCP.lrplugin/HandlerAIMasks.lua +549 -0
- package/dist/LightroomMCP.lrplugin/HandlerCatalog.lua +256 -0
- package/dist/LightroomMCP.lrplugin/HandlerCollections.lua +337 -0
- package/dist/LightroomMCP.lrplugin/HandlerDevelop.lua +1668 -0
- package/dist/LightroomMCP.lrplugin/HandlerExport.lua +149 -0
- package/dist/LightroomMCP.lrplugin/HandlerImport.lua +108 -0
- package/dist/LightroomMCP.lrplugin/HandlerLocalAdjustments.lua +330 -0
- package/dist/LightroomMCP.lrplugin/HandlerMetadata.lua +169 -0
- package/dist/LightroomMCP.lrplugin/HandlerOrganization.lua +783 -0
- package/dist/LightroomMCP.lrplugin/HandlerPreview.lua +189 -0
- package/dist/LightroomMCP.lrplugin/HandlerSearch.lua +185 -0
- package/dist/LightroomMCP.lrplugin/HandlerSelection.lua +302 -0
- package/dist/LightroomMCP.lrplugin/HandlerSpots.lua +313 -0
- package/dist/LightroomMCP.lrplugin/HandlerWatermark.lua +59 -0
- package/dist/LightroomMCP.lrplugin/Info.lua +25 -0
- package/dist/LightroomMCP.lrplugin/JSON.lua +270 -0
- package/dist/LightroomMCP.lrplugin/Log.lua +92 -0
- package/dist/LightroomMCP.lrplugin/MenuShowStatus.lua +22 -0
- package/dist/LightroomMCP.lrplugin/PhotoLookup.lua +39 -0
- package/dist/LightroomMCP.lrplugin/PluginInfoProvider.lua +865 -0
- package/dist/LightroomMCP.lrplugin/PluginInit.lua +48 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +31 -0
- package/dist/cli.js.map +1 -0
- package/dist/configs/claude-code.mcp.json +9 -0
- package/dist/configs/claude-desktop.json +12 -0
- package/dist/configs/generic-stdio-client.json +10 -0
- package/dist/configs/mcp-proxy-http.json +9 -0
- package/dist/create-server.d.ts +12 -0
- package/dist/create-server.d.ts.map +1 -0
- package/dist/create-server.js +17 -0
- package/dist/create-server.js.map +1 -0
- package/dist/deepseek-harness/README.md +112 -0
- package/dist/deepseek-harness/deepseek-mcp-harness.mjs +292 -0
- package/dist/dispatcher.d.ts +34 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +72 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/heartbeat.d.ts +17 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +36 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/dist/install-plugin.d.ts +16 -0
- package/dist/install-plugin.d.ts.map +1 -0
- package/dist/install-plugin.js +125 -0
- package/dist/install-plugin.js.map +1 -0
- package/dist/instance-lock.d.ts +5 -0
- package/dist/instance-lock.d.ts.map +1 -0
- package/dist/instance-lock.js +77 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/list-tools-handler.d.ts +16 -0
- package/dist/list-tools-handler.d.ts.map +1 -0
- package/dist/list-tools-handler.js +50 -0
- package/dist/list-tools-handler.js.map +1 -0
- package/dist/plugin-liveness.d.ts +48 -0
- package/dist/plugin-liveness.d.ts.map +1 -0
- package/dist/plugin-liveness.js +75 -0
- package/dist/plugin-liveness.js.map +1 -0
- package/dist/plugin-socket.d.ts +32 -0
- package/dist/plugin-socket.d.ts.map +1 -0
- package/dist/plugin-socket.js +97 -0
- package/dist/plugin-socket.js.map +1 -0
- package/dist/ports.d.ts +3 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +22 -0
- package/dist/ports.js.map +1 -0
- package/dist/token.d.ts +3 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +23 -0
- package/dist/token.js.map +1 -0
- package/dist/tool-contracts.d.ts +13 -0
- package/dist/tool-contracts.d.ts.map +1 -0
- package/dist/tool-contracts.js +1422 -0
- package/dist/tool-contracts.js.map +1 -0
- package/dist/tool-handler.d.ts +23 -0
- package/dist/tool-handler.d.ts.map +1 -0
- package/dist/tool-handler.js +96 -0
- package/dist/tool-handler.js.map +1 -0
- package/dist/validate-args.d.ts +7 -0
- package/dist/validate-args.d.ts.map +1 -0
- package/dist/validate-args.js +37 -0
- package/dist/validate-args.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/wait-until.d.ts +7 -0
- package/dist/wait-until.d.ts.map +1 -0
- package/dist/wait-until.js +15 -0
- package/dist/wait-until.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
local LrApplication = import 'LrApplication'
|
|
2
|
+
|
|
3
|
+
local PhotoLookup = require 'PhotoLookup'
|
|
4
|
+
local Log = require 'Log'
|
|
5
|
+
|
|
6
|
+
local MetadataHandler = {}
|
|
7
|
+
|
|
8
|
+
-- Return the group only when it carries at least one value, so empty IPTC
|
|
9
|
+
-- sections are omitted from the response (consistent with the gps group)
|
|
10
|
+
-- instead of surfacing a table full of empty strings.
|
|
11
|
+
local function nonEmptyGroup(fields)
|
|
12
|
+
for _, v in pairs(fields) do
|
|
13
|
+
if v ~= nil and v ~= "" then return fields end
|
|
14
|
+
end
|
|
15
|
+
return nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
local function hslDevelopSettings(developSettings)
|
|
19
|
+
return nonEmptyGroup({
|
|
20
|
+
SaturationAdjustmentRed = developSettings.SaturationAdjustmentRed,
|
|
21
|
+
SaturationAdjustmentOrange = developSettings.SaturationAdjustmentOrange,
|
|
22
|
+
SaturationAdjustmentYellow = developSettings.SaturationAdjustmentYellow,
|
|
23
|
+
SaturationAdjustmentGreen = developSettings.SaturationAdjustmentGreen,
|
|
24
|
+
SaturationAdjustmentAqua = developSettings.SaturationAdjustmentAqua,
|
|
25
|
+
SaturationAdjustmentBlue = developSettings.SaturationAdjustmentBlue,
|
|
26
|
+
SaturationAdjustmentPurple = developSettings.SaturationAdjustmentPurple,
|
|
27
|
+
SaturationAdjustmentMagenta = developSettings.SaturationAdjustmentMagenta,
|
|
28
|
+
HueAdjustmentRed = developSettings.HueAdjustmentRed,
|
|
29
|
+
HueAdjustmentOrange = developSettings.HueAdjustmentOrange,
|
|
30
|
+
HueAdjustmentYellow = developSettings.HueAdjustmentYellow,
|
|
31
|
+
HueAdjustmentGreen = developSettings.HueAdjustmentGreen,
|
|
32
|
+
HueAdjustmentAqua = developSettings.HueAdjustmentAqua,
|
|
33
|
+
HueAdjustmentBlue = developSettings.HueAdjustmentBlue,
|
|
34
|
+
HueAdjustmentPurple = developSettings.HueAdjustmentPurple,
|
|
35
|
+
HueAdjustmentMagenta = developSettings.HueAdjustmentMagenta,
|
|
36
|
+
LuminanceAdjustmentRed = developSettings.LuminanceAdjustmentRed,
|
|
37
|
+
LuminanceAdjustmentOrange = developSettings.LuminanceAdjustmentOrange,
|
|
38
|
+
LuminanceAdjustmentYellow = developSettings.LuminanceAdjustmentYellow,
|
|
39
|
+
LuminanceAdjustmentGreen = developSettings.LuminanceAdjustmentGreen,
|
|
40
|
+
LuminanceAdjustmentAqua = developSettings.LuminanceAdjustmentAqua,
|
|
41
|
+
LuminanceAdjustmentBlue = developSettings.LuminanceAdjustmentBlue,
|
|
42
|
+
LuminanceAdjustmentPurple = developSettings.LuminanceAdjustmentPurple,
|
|
43
|
+
LuminanceAdjustmentMagenta = developSettings.LuminanceAdjustmentMagenta,
|
|
44
|
+
})
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
function MetadataHandler.getPhotoMetadata(args)
|
|
48
|
+
if not args.photo_id then
|
|
49
|
+
error("photo_id is required")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
local catalog = LrApplication.activeCatalog()
|
|
53
|
+
local photoData = nil
|
|
54
|
+
|
|
55
|
+
catalog:withReadAccessDo(function()
|
|
56
|
+
local photo = PhotoLookup.resolveOne(catalog, args.photo_id)
|
|
57
|
+
|
|
58
|
+
if not photo then
|
|
59
|
+
error("Photo not found: " .. args.photo_id)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
-- Get keywords
|
|
63
|
+
local keywords = {}
|
|
64
|
+
local photoKeywords = photo:getRawMetadata('keywords')
|
|
65
|
+
if photoKeywords then
|
|
66
|
+
for _, kw in ipairs(photoKeywords) do
|
|
67
|
+
table.insert(keywords, kw:getName())
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
-- Get develop settings
|
|
72
|
+
local developSettings = photo:getDevelopSettings()
|
|
73
|
+
|
|
74
|
+
-- GPS is a raw {latitude, longitude} table; omit the group when absent
|
|
75
|
+
-- or when present but carrying no coordinates.
|
|
76
|
+
local gps = photo:getRawMetadata('gps')
|
|
77
|
+
local gpsData = nil
|
|
78
|
+
if gps then
|
|
79
|
+
gpsData = nonEmptyGroup({
|
|
80
|
+
latitude = gps.latitude,
|
|
81
|
+
longitude = gps.longitude,
|
|
82
|
+
altitude = photo:getRawMetadata('gpsAltitude'),
|
|
83
|
+
})
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
photoData = {
|
|
87
|
+
id = photo.localIdentifier,
|
|
88
|
+
path = photo:getRawMetadata('path'),
|
|
89
|
+
filename = photo:getFormattedMetadata('fileName'),
|
|
90
|
+
rating = photo:getRawMetadata('rating'),
|
|
91
|
+
colorLabel = photo:getRawMetadata('colorNameForLabel'),
|
|
92
|
+
pickStatus = photo:getRawMetadata('pickStatus'),
|
|
93
|
+
keywords = keywords,
|
|
94
|
+
-- Title / caption / headline (IPTC content description).
|
|
95
|
+
title = photo:getFormattedMetadata('title'),
|
|
96
|
+
caption = photo:getFormattedMetadata('caption'),
|
|
97
|
+
headline = photo:getFormattedMetadata('headline'),
|
|
98
|
+
-- EXIF capture data.
|
|
99
|
+
dateTimeOriginal = photo:getFormattedMetadata('dateTimeOriginal'),
|
|
100
|
+
dateTimeDigitized = photo:getFormattedMetadata('dateTimeDigitized'),
|
|
101
|
+
cameraMake = photo:getFormattedMetadata('cameraMake'),
|
|
102
|
+
cameraModel = photo:getFormattedMetadata('cameraModel'),
|
|
103
|
+
cameraSerialNumber = photo:getFormattedMetadata('cameraSerialNumber'),
|
|
104
|
+
lens = photo:getFormattedMetadata('lens'),
|
|
105
|
+
isoSpeedRating = photo:getFormattedMetadata('isoSpeedRating'),
|
|
106
|
+
focalLength = photo:getFormattedMetadata('focalLength'),
|
|
107
|
+
focalLength35mm = photo:getFormattedMetadata('focalLength35mm'),
|
|
108
|
+
aperture = photo:getFormattedMetadata('aperture'),
|
|
109
|
+
shutterSpeed = photo:getFormattedMetadata('shutterSpeed'),
|
|
110
|
+
exposureBias = photo:getFormattedMetadata('exposureBias'),
|
|
111
|
+
exposureProgram = photo:getFormattedMetadata('exposureProgram'),
|
|
112
|
+
meteringMode = photo:getFormattedMetadata('meteringMode'),
|
|
113
|
+
flash = photo:getFormattedMetadata('flash'),
|
|
114
|
+
dimensions = photo:getFormattedMetadata('dimensions'),
|
|
115
|
+
fileSize = photo:getFormattedMetadata('fileSize'),
|
|
116
|
+
fileFormat = photo:getRawMetadata('fileFormat'),
|
|
117
|
+
artist = photo:getFormattedMetadata('artist'),
|
|
118
|
+
software = photo:getFormattedMetadata('software'),
|
|
119
|
+
gps = gpsData,
|
|
120
|
+
-- IPTC location ("Sublocation" is the SDK `location` field).
|
|
121
|
+
location = nonEmptyGroup({
|
|
122
|
+
sublocation = photo:getFormattedMetadata('location'),
|
|
123
|
+
city = photo:getFormattedMetadata('city'),
|
|
124
|
+
stateProvince = photo:getFormattedMetadata('stateProvince'),
|
|
125
|
+
country = photo:getFormattedMetadata('country'),
|
|
126
|
+
isoCountryCode = photo:getFormattedMetadata('isoCountryCode'),
|
|
127
|
+
}),
|
|
128
|
+
copyright = nonEmptyGroup({
|
|
129
|
+
creator = photo:getFormattedMetadata('creator'),
|
|
130
|
+
notice = photo:getFormattedMetadata('copyright'),
|
|
131
|
+
status = photo:getFormattedMetadata('copyrightState'),
|
|
132
|
+
rightsUsageTerms = photo:getFormattedMetadata('rightsUsageTerms'),
|
|
133
|
+
}),
|
|
134
|
+
developSettings = {
|
|
135
|
+
whiteBalance = developSettings.WhiteBalance,
|
|
136
|
+
temperature = developSettings.Temperature,
|
|
137
|
+
tint = developSettings.Tint,
|
|
138
|
+
exposure = developSettings.Exposure2012,
|
|
139
|
+
contrast = developSettings.Contrast2012,
|
|
140
|
+
highlights = developSettings.Highlights2012,
|
|
141
|
+
shadows = developSettings.Shadows2012,
|
|
142
|
+
whites = developSettings.Whites2012,
|
|
143
|
+
blacks = developSettings.Blacks2012,
|
|
144
|
+
texture = developSettings.Texture,
|
|
145
|
+
clarity = developSettings.Clarity2012,
|
|
146
|
+
dehaze = developSettings.Dehaze,
|
|
147
|
+
vibrance = developSettings.Vibrance,
|
|
148
|
+
saturation = developSettings.Saturation,
|
|
149
|
+
hsl = hslDevelopSettings(developSettings),
|
|
150
|
+
convertToGrayscale = developSettings.ConvertToGrayscale,
|
|
151
|
+
toneCurveName = developSettings.ToneCurveName2012,
|
|
152
|
+
toneCurve = developSettings.ToneCurvePV2012,
|
|
153
|
+
toneCurveRed = developSettings.ToneCurvePV2012Red,
|
|
154
|
+
toneCurveGreen = developSettings.ToneCurvePV2012Green,
|
|
155
|
+
toneCurveBlue = developSettings.ToneCurvePV2012Blue,
|
|
156
|
+
parametricShadows = developSettings.ParametricShadows,
|
|
157
|
+
parametricDarks = developSettings.ParametricDarks,
|
|
158
|
+
parametricLights = developSettings.ParametricLights,
|
|
159
|
+
parametricHighlights = developSettings.ParametricHighlights,
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
end)
|
|
163
|
+
|
|
164
|
+
Log.info("Retrieved metadata for photo: " .. args.photo_id)
|
|
165
|
+
|
|
166
|
+
return photoData
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
return MetadataHandler
|