@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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/LightroomMCP.lrplugin/HandlerAI.lua +466 -0
  4. package/dist/LightroomMCP.lrplugin/HandlerAIMasks.lua +549 -0
  5. package/dist/LightroomMCP.lrplugin/HandlerCatalog.lua +256 -0
  6. package/dist/LightroomMCP.lrplugin/HandlerCollections.lua +337 -0
  7. package/dist/LightroomMCP.lrplugin/HandlerDevelop.lua +1668 -0
  8. package/dist/LightroomMCP.lrplugin/HandlerExport.lua +149 -0
  9. package/dist/LightroomMCP.lrplugin/HandlerImport.lua +108 -0
  10. package/dist/LightroomMCP.lrplugin/HandlerLocalAdjustments.lua +330 -0
  11. package/dist/LightroomMCP.lrplugin/HandlerMetadata.lua +169 -0
  12. package/dist/LightroomMCP.lrplugin/HandlerOrganization.lua +783 -0
  13. package/dist/LightroomMCP.lrplugin/HandlerPreview.lua +189 -0
  14. package/dist/LightroomMCP.lrplugin/HandlerSearch.lua +185 -0
  15. package/dist/LightroomMCP.lrplugin/HandlerSelection.lua +302 -0
  16. package/dist/LightroomMCP.lrplugin/HandlerSpots.lua +313 -0
  17. package/dist/LightroomMCP.lrplugin/HandlerWatermark.lua +59 -0
  18. package/dist/LightroomMCP.lrplugin/Info.lua +25 -0
  19. package/dist/LightroomMCP.lrplugin/JSON.lua +270 -0
  20. package/dist/LightroomMCP.lrplugin/Log.lua +92 -0
  21. package/dist/LightroomMCP.lrplugin/MenuShowStatus.lua +22 -0
  22. package/dist/LightroomMCP.lrplugin/PhotoLookup.lua +39 -0
  23. package/dist/LightroomMCP.lrplugin/PluginInfoProvider.lua +865 -0
  24. package/dist/LightroomMCP.lrplugin/PluginInit.lua +48 -0
  25. package/dist/cli.d.ts +6 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +31 -0
  28. package/dist/cli.js.map +1 -0
  29. package/dist/configs/claude-code.mcp.json +9 -0
  30. package/dist/configs/claude-desktop.json +12 -0
  31. package/dist/configs/generic-stdio-client.json +10 -0
  32. package/dist/configs/mcp-proxy-http.json +9 -0
  33. package/dist/create-server.d.ts +12 -0
  34. package/dist/create-server.d.ts.map +1 -0
  35. package/dist/create-server.js +17 -0
  36. package/dist/create-server.js.map +1 -0
  37. package/dist/deepseek-harness/README.md +112 -0
  38. package/dist/deepseek-harness/deepseek-mcp-harness.mjs +292 -0
  39. package/dist/dispatcher.d.ts +34 -0
  40. package/dist/dispatcher.d.ts.map +1 -0
  41. package/dist/dispatcher.js +72 -0
  42. package/dist/dispatcher.js.map +1 -0
  43. package/dist/heartbeat.d.ts +17 -0
  44. package/dist/heartbeat.d.ts.map +1 -0
  45. package/dist/heartbeat.js +36 -0
  46. package/dist/heartbeat.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +255 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/install-plugin.d.ts +16 -0
  52. package/dist/install-plugin.d.ts.map +1 -0
  53. package/dist/install-plugin.js +125 -0
  54. package/dist/install-plugin.js.map +1 -0
  55. package/dist/instance-lock.d.ts +5 -0
  56. package/dist/instance-lock.d.ts.map +1 -0
  57. package/dist/instance-lock.js +77 -0
  58. package/dist/instance-lock.js.map +1 -0
  59. package/dist/list-tools-handler.d.ts +16 -0
  60. package/dist/list-tools-handler.d.ts.map +1 -0
  61. package/dist/list-tools-handler.js +50 -0
  62. package/dist/list-tools-handler.js.map +1 -0
  63. package/dist/plugin-liveness.d.ts +48 -0
  64. package/dist/plugin-liveness.d.ts.map +1 -0
  65. package/dist/plugin-liveness.js +75 -0
  66. package/dist/plugin-liveness.js.map +1 -0
  67. package/dist/plugin-socket.d.ts +32 -0
  68. package/dist/plugin-socket.d.ts.map +1 -0
  69. package/dist/plugin-socket.js +97 -0
  70. package/dist/plugin-socket.js.map +1 -0
  71. package/dist/ports.d.ts +3 -0
  72. package/dist/ports.d.ts.map +1 -0
  73. package/dist/ports.js +22 -0
  74. package/dist/ports.js.map +1 -0
  75. package/dist/token.d.ts +3 -0
  76. package/dist/token.d.ts.map +1 -0
  77. package/dist/token.js +23 -0
  78. package/dist/token.js.map +1 -0
  79. package/dist/tool-contracts.d.ts +13 -0
  80. package/dist/tool-contracts.d.ts.map +1 -0
  81. package/dist/tool-contracts.js +1422 -0
  82. package/dist/tool-contracts.js.map +1 -0
  83. package/dist/tool-handler.d.ts +23 -0
  84. package/dist/tool-handler.d.ts.map +1 -0
  85. package/dist/tool-handler.js +96 -0
  86. package/dist/tool-handler.js.map +1 -0
  87. package/dist/validate-args.d.ts +7 -0
  88. package/dist/validate-args.d.ts.map +1 -0
  89. package/dist/validate-args.js +37 -0
  90. package/dist/validate-args.js.map +1 -0
  91. package/dist/version.d.ts +2 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +4 -0
  94. package/dist/version.js.map +1 -0
  95. package/dist/wait-until.d.ts +7 -0
  96. package/dist/wait-until.d.ts.map +1 -0
  97. package/dist/wait-until.js +15 -0
  98. package/dist/wait-until.js.map +1 -0
  99. 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