Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Your AI agent builds client galleries from your selects, captions and keywords whole shoots, finds images in your library and shares links after your OK. Sign in to PhotoShelter once in your own Cloud Browser. No API key request.
9 tools Read and write
PhotoShelter has no MCP server and no ChatGPT or Claude app. It documents an API, but customers contact support for a key instead of generating one (checked 8 Nov 2026). Cotlet runs 9 PhotoShelter tools hosted, over MCP for agents and REST for scripts, in your own PhotoShelter login.
| What you need | PhotoShelter API | By hand | Cotlet |
|---|---|---|---|
| Galleries and library search | With a key | Yes, one by one | Yes |
| Captions and keywords in bulk | With a key | Batch tools | Yes |
| Share with a client | With a key | Yes | Yes, after your OK |
| Ask in ChatGPT or Claude | No | No | Yes |
| Developer needed | Yes | No | No |
Checked 8 Nov 2026. Sources: PhotoShelter engineering and API docs · PhotoShelter for Brands API · PhotoShelter for Brands integrations
Once, in a browser we host for you.
One address in its settings.
It drafts the work, you OK what customers get.
We never keep your PhotoShelter password, and no gallery is shared or opened to the public until you approve it. Who can see your session
Sign in to PhotoShelter in a Cloud Browser. Create a Cotlet account, open PhotoShelter in its Cloud Browser, sign in with your PhotoShelter account and press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as the MCP server or connector URL in your agent.
Let the agent in. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts send an API key made in the console.
PhotoShelter shares the address https://cotlet.dev/mcp/v1 with every other app you enable, so one connector covers them all. Turned PhotoShelter on after connecting? Refresh the connector and the 9 tools appear.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: photoshelter_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: photoshelter_write New galleries start private. Opening a gallery to the public or a password, and sending its link, wait for your OK.
Returns galleries with name, parent collection, access setting and number of images. Newest first.
MCP callphotoshelter_read → list_galleries
REST endpointGET https://cotlet.dev/api/v1/photoshelter/galleries
| Name | Type | Description |
|---|---|---|
| query string | string | Gallery name. |
| page integer | integer | Page number. Default: 1. |
{
"galleries": [
{
"gallery_id": "G0000aBcD",
"name": "Harbor Run 2026",
"collection": "Events",
"access": "Private",
"images": 412
}
],
"page": 1
} Returns the gallery images with file names and captions, plus its access setting and share link.
MCP callphotoshelter_read → get_gallery
REST endpointGET https://cotlet.dev/api/v1/photoshelter/galleries/{gallery_id}
| Name | Type | Description |
|---|---|---|
| gallery_id string required | string | Gallery ID from list_galleries. |
| page integer | integer | Page number. Default: 1. |
{
"gallery_id": "gallery_8c41d2"
} {
"gallery_id": "G0000aBcD",
"name": "Harbor Run 2026",
"access": "Private",
"images": [
{
"image_id": "I0000xYz1",
"file": "HR26_0412.jpg",
"caption": ""
}
]
} Creates an empty private gallery. Nobody sees it until share_gallery, so it runs at once.
MCP callphotoshelter_write → create_gallery
REST endpointPOST https://cotlet.dev/api/v1/photoshelter/galleries
| Name | Type | Description |
|---|---|---|
| name string required | string | Gallery name. |
| collection string | string | Parent collection name. |
{
"name": "Jane Doe"
} {
"gallery_id": "G0000eFgH",
"name": "Okafor Wedding Selects",
"collection": "Weddings",
"access": "Private"
} Adds the images to the gallery without removing them from others. Runs at once; remove them again in PhotoShelter.
MCP callphotoshelter_write → add_images_to_gallery
REST endpointPOST https://cotlet.dev/api/v1/photoshelter/galleries/{gallery_id}/images-to-galleries
| Name | Type | Description |
|---|---|---|
| gallery_id string required | string | Gallery ID from list_galleries. |
| image_ids string[] required | string[] | Image IDs from search_images or get_gallery. |
{
"gallery_id": "gallery_8c41d2",
"image_ids": [
"image ids"
]
} {
"gallery_id": "G0000eFgH",
"added": 60
} Sets the gallery to private, password protected or public. Public and password protected galleries are visible to anyone with the link or password. By default you confirm each call; you can switch that off for this tool.
MCP callphotoshelter_write → set_gallery_access
REST endpointPUT https://cotlet.dev/api/v1/photoshelter/galleries/{gallery_id}/access
| Name | Type | Description |
|---|---|---|
| gallery_id string required | string | Gallery ID from list_galleries. |
| access string required | string | private, password or public. |
| password string | string | Password for access password. |
{
"gallery_id": "gallery_8c41d2",
"access": "access"
} {
"gallery_id": "G0000eFgH",
"access": "Password",
"password_set": true
} Search by keyword, caption or file name. Captions, keywords and credits can be written on many images in one call.
Returns matching images with gallery, file name, caption and keywords.
MCP callphotoshelter_read → search_images
REST endpointGET https://cotlet.dev/api/v1/photoshelter/images/search
| Name | Type | Description |
|---|---|---|
| query string required | string | Keyword, caption text or file name. |
| page integer | integer | Page number. Default: 1. |
{
"query": "query"
} {
"images": [
{
"image_id": "I0000xYz1",
"file": "HR26_0412.jpg",
"gallery": "Harbor Run 2026",
"keywords": [
"finish line",
"runners"
]
}
],
"page": 1
} Returns caption, keywords, credit, capture date and the galleries the image is in.
MCP callphotoshelter_read → get_image
REST endpointGET https://cotlet.dev/api/v1/photoshelter/images/{image_id}
| Name | Type | Description |
|---|---|---|
| image_id string required | string | Image ID from search_images or get_gallery. |
{
"image_id": "image_8c41d2"
} {
"image_id": "I0000xYz1",
"file": "HR26_0412.jpg",
"caption": "Runners at the finish line",
"keywords": [
"finish line",
"runners"
],
"credit": "Dana Reyes",
"captured": "2026-10-04"
} Writes caption, keywords and credit on one or more images. Visible only where the gallery is shared; undo by writing the old values. Runs at once.
MCP callphotoshelter_write → update_image_metadata
REST endpointPATCH https://cotlet.dev/api/v1/photoshelter/image-metadata
| Name | Type | Description |
|---|---|---|
| image_ids string[] required | string[] | Image IDs. |
| caption string | string | Caption. |
| keywords string[] | string[] | Keywords to add. |
| credit string | string | Credit line. |
{
"image_ids": [
"image ids"
]
} {
"updated": 24,
"example": {
"image_id": "I0000xYz1",
"caption": "Runners at the finish line",
"keywords": [
"finish line",
"runners",
"harbor run"
]
}
} Your signed-in PhotoShelter profile, AES-256-GCM encrypted, in Finland. No password.
The 9 PhotoShelter tools, never the session cookie.
What your account sees: galleries, images, captions, share links.
Uploads, deletes, sales and payouts, website design, billing.
You sign in again yourself, in the same Cloud Browser.
Disable for agents, reset the browser, or change your PhotoShelter password.
Cotlet never types your password: you sign in yourself, and the agent only uses the session. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results).
When PhotoShelter moves a button in the library or renames an access setting, we fix the tool and your agent calls it the same way. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Create a gallery | Yes, delete it in PhotoShelter |
| Add images to a gallery | Yes, remove them |
| Update captions and keywords | Yes, write the old values |
| Change gallery access | Yes, set it back |
| Share a gallery | No, but you can make it private again |
2 of 9 tools ask first: set_gallery_access, share_gallery. A new private gallery, added images and caption edits reach no customer, so they run at once. You can turn the wait off per tool once you trust a routine.
{
"name": "share_gallery",
"arguments": {
"gallery_id": "G0000eFgH",
"to": [
"grace@example.com"
],
"message": "Your wedding selects are ready."
}
} curl -X POST https://cotlet.dev/api/v1/photoshelter/galleries/G0000eFgH/share \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to":["grace@example.com"],"message":"Your wedding selects are ready."}' {
"gallery_id": "G0000eFgH",
"shared_with": [
"grace@example.com"
],
"link": "https://example.photoshelter.com/gallery/G0000eFgH"
} A cron job or n8n flow can call the same tools over REST at /api/v1/photoshelter with the same key and price, in JSON. Failed calls are free. Each tool row above shows its REST path.
About $18 a monthfor a photographer with about 8 shoots, 3,060 credits. Your PhotoShelter plan stays as it is.
| Job | Calls | Credits |
|---|---|---|
| Client gallery built and shared | 6 × 8 | 480 |
| Shoot captioned and keyworded | 4 × 8 | 320 |
| Library search | 2 × 30 | 600 |
| Public galleries reviewed, weekly | 4 × 4 | 160 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 3,060 |
PhotoShelter publishes no usage counts, so the month is our example. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| PhotoShelter API | Galleries and images for your own developer. | Key through support; you build and host the code. |
| PhotoShelter AI Assistant | Help inside PhotoShelter. | Works inside PhotoShelter, not from ChatGPT, Claude or n8n. |
| By hand | Every screen of PhotoShelter. | Your editing time. |
If your developer already has a PhotoShelter key, building on the API is cheaper for simple reads. To build, caption and share galleries by asking in ChatGPT or Claude, Cotlet works in the PhotoShelter account you already have.
Prefer code? Our public repo has a ready PhotoShelter MCP config for Claude Code, ChatGPT and Cursor, an agent skill and a small command-line tool. Add your Cotlet API key and your agent works in your own PhotoShelter account.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), in business since 2019, led by its founders Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the PhotoShelter tools go to contact@cotlet.dev.
Sign up free at https://cotlet.dev, open PhotoShelter under Integrations in the console and sign in to PhotoShelter in its Cloud Browser. The trial starts with your first app and asks for no card.
Sign up at cotlet.dev, log in to PhotoShelter once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your PhotoShelter account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in PhotoShelter: build a client gallery of selects; caption and keyword a shoot; find images in the library. You ask in plain words, and anything that reaches other people waits for your OK first.
No. PhotoShelter has no ChatGPT or Claude connector of its own and PhotoShelter has no official MCP server (checked 8 Nov 2026). Cotlet is an independent one that works in ChatGPT, Claude, Cursor and any MCP client, on your signed-in account.
Yes, with Cotlet. ChatGPT creates the gallery, adds the images you describe and shares it with your client after your OK.
Yes, with Cotlet. ChatGPT writes captions, keywords and credits on a whole gallery at once, so a shoot is searchable the same day.
Yes, with Cotlet. Ask in plain words and ChatGPT searches your library by keyword, caption or file name and lists the matches.
No. Cotlet works through your own PhotoShelter sign-in, so you skip the support request for a key. It can do what your account can do in PhotoShelter.
No. Upload from Lightroom, the PhotoShelter uploader or the app as you do today. The agent works with images already in your library.
Only in how it is called. Both carry the same 9 tools, inputs, answers, API key and price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with PhotoShelter.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy