[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Add captions and keywords to SmugMug photos

> Caption and keyword hundreds of SmugMug photos in one pass, keeping the captions you wrote. Search and find-ability improve, you review the changes.

Source: https://cotlet.dev/integrations/smugmug-api-mcp-server/add-captions-and-keywords-to-photos

You uploaded 400 photos from an event. Captions and keywords make them findable in search, but typing them one photo at a time is the job that never gets done.

Cotlet does it in your own SmugMug account with list\_gallery\_photos and update\_photo\_details, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=smugmug) [All SmugMug tools](https://cotlet.dev/integrations/smugmug-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can SmugMug do this on its own?

SmugMug edits title, caption and keywords in bulk from the Organizer and the Library, and the Image resource of the API has writable Caption, Keywords and Title fields (checked 17 Oct 2026). Both write the text you give them. Neither looks at each photo and picks different words, which is the gap this job fills.

## How you do it in SmugMug today

1. For one photo, open it in the Lightbox, click the photo details icon and then Edit Photo Details to set title, caption and keywords.
2. In the Library, select several photos with the checkmark, click the pencil icon and add a keyword to all of them.
3. In the Organizer, go to My Site > Site Organizer, select the gallery and photos, and click the wrench icon Title, Caption, and Keywords.
4. If the selected photos already have different captions, SmugMug asks whether to replace them or add the new text before or after.
5. The same text lands on every photo you selected, so photos that need different words still mean many rounds by hand.

## How to add captions and keywords to SmugMug photos

Prompt

```
Take the gallery "Lakeview 10K race" in SmugMug. Look at each photo and add the keywords "running" and "lakeview", plus "finish line" on the ones that show it. Keep the captions that exist and add the race name after them.
```

1. 01  
### Read the gallery  
list\_gallery\_photos pages through the whole gallery and returns each photo with its current title, caption, keywords and a thumbnail link, so the agent works from what is there now.
2. 02  
### Look at the photos  
The agent opens the thumbnails and sorts photos into groups by what they show, for example the finish line, the start, the crowd. Filenames alone are not used as the description.
3. 03  
### Write per group  
update\_photo\_details runs once per group with the photo IDs of that group. Keywords are added without removing the ones already there.
4. 04  
### Keep what you wrote  
Where a caption exists, the agent sets caption\_mode to after, so your text stays and the new line follows it. Empty captions are filled.
5. 05  
### Keep a way back  
Each call returns the previous caption of every photo it changed. The agent keeps them in its report, so a wrong caption is put back with one more call.

### What you get back

Example data

```
Gallery "Lakeview 10K race": 412 photos read
Keywords added to 412: running, lakeview
"finish line" added to 96 photos
Caption extended on 38 photos (existing text kept)
Left for you 7: photos with no clear subject, listed by filename
```

### Other ways to ask

- Only fill photos that have no caption yet and leave every existing caption alone.
- Add the keyword "headshots" to every photo in the folder "Studio 2026", without looking at them.
- Show me the captions you would write for the first 20 photos and write nothing yet.
- Remove the keyword "test" from every photo in the gallery "Smith wedding".

## What SmugMug allows, and what to know first

- A caption can be up to 65,000 characters long, so a full story fits.
- Original filenames are shown under the thumbnails and cannot be edited.
- Separate keywords with semicolons, and put phrases in quotes or separate them with semicolons.
- Keywords need time to index in the background, so search shows them a little later.
- SmugMug reads IPTC keywords at upload, but keywords you add on SmugMug are not written back into the IPTC data of your file.

update\_photo\_details changes only your own SmugMug data and reach no one else, so it runs without asking first.

Sources: [SmugMug Help: Add photo titles, captions, and keywords](https://www.smugmughelp.com/hc/en-us/articles/18212448992660-Add-photo-titles-captions-and-keywords) · [SmugMug API v2: Image reference](https://api.smugmug.com/api/v2/doc/reference/image.html)

## Call update\_photo\_details from a script

curl

```
curl -X PATCH https://cotlet.dev/api/v1/smugmug/photo-details \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"photo_ids":["Qm7xKd","Rt2nWc"],"caption":"Lakeview 10K, finish line.","caption_mode":"after","keywords_add":["running","lakeview","finish line"]}'
```

Example response

```
{
"updated": 2,
"photos": [
{
"photo_id": "Qm7xKd",
"filename": "DSC_3025.jpg",
"caption": "Lakeview 10K, finish line.",
"keywords": [
"running",
"lakeview",
"finish line"
],
"previous_caption": ""
},
{
"photo_id": "Rt2nWc",
"filename": "DSC_3026.jpg",
"caption": "First dance Lakeview 10K, finish line.",
"keywords": [
"wedding",
"running",
"lakeview",
"finish line"
],
"previous_caption": "First dance"
}
]
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is smugmug\_write → update\_photo\_details. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/smugmug-api-mcp-server.md#automations)

## SmugMug tools this automation uses

__Cotlet SmugMug tools used to add captions and keywords to SmugMug photos__
| Tool | Parameters |
| ---------------------- | -------------------------------------------------------------------------- |
| list\_gallery\_photos | gallery\_id, cursor |
| update\_photo\_details | photo\_ids, title, caption, caption\_mode, keywords\_add, keywords\_remove |

[All 12 SmugMug tools with descriptions](https://cotlet.dev/integrations/smugmug-api-mcp-server.md#tools)

## Frequently asked questions

### Is it safe to connect SmugMug to Cotlet?

Yes. You sign in to SmugMug yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get SmugMug once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More SmugMug automations

- [Make SmugMug client galleries private](https://cotlet.dev/integrations/smugmug-api-mcp-server/make-client-galleries-private.md)
- [Deliver photos to a SmugMug client](https://cotlet.dev/integrations/smugmug-api-mcp-server/deliver-photos-to-a-client.md)
- [SmugMug API and MCP server: every tool](https://cotlet.dev/integrations/smugmug-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to SmugMug.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with SmugMug.

[Sign up free](https://cotlet.dev/app/signup?app=smugmug)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
