Gumnut Photos
Find and organize photos
- Category
- Content & Design
- Primary Subcategory
- Personal Media Tracking & Libraries
Integration details
Description
Gumnut Photos helps users search and browse their private photo libraries, inspect image contents, organize assets into albums and people, update metadata, and safely manage uploads and trash through ChatGPT.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Personal Media Tracking & Libraries
- Secondary Subcategories
- None listed
- Brand
- Gumnut
- Access
- Account required
- First tracked
- 2026-09-10
- Tool count
- 38
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Personal Media Tracking & Libraries
View Category38 tools agents can invoke
Adds one or more existing assets to the specified album. Assets must already be in the same library as the album (this tool does not upload new assets). Assets already in the album are silently skipped and returned separately as `duplicate_assets`; missing or different-library IDs are skipped and returned as `not_found_assets`. Idempotent: calling with the same IDs twice leaves the album in the same state.
add_assets_to_album
Clusters geotagged assets in a map viewport (bounding box) onto a grid of square cells and returns one entry per non-empty cell — its centroid, asset count, and a representative cover asset. Use this to render a clustered map or to count how many photos fall in each part of a viewport at a chosen zoom granularity. The result is a single un-paginated list capped at 1000 cells; a viewport that is too dense at the given `cell_size` returns 422 (coarsen `cell_size` or zoom in). To list the individual assets behind a cell, call `list_assets` with a tighter bounding box over the same filters. Album and person filters compose using AND.
get_geo_clusters
Adds a user-drawn face box to an asset, for a face the detector missed. To remove a face detection instead, use `delete_face`; to introduce a brand-new identity first, use `create_person`.
create_face
Creates a new, empty photo library for the authenticated user. A library is the top-level container for assets, albums, people, and faces — most users have exactly one. Only create a new library when the user explicitly asks for a separate container.
create_library
Creates a person record for grouping faces. The record may initially have no name and no faces. To assign an existing face to an existing person, use `update_face` with the target `person_id`.
create_person
Creates a new, empty album in a library (with optional name and description) and returns it. The album starts empty — follow up with `add_assets_to_album` to populate it. To rename an existing album, use `update_album` instead of creating a new one.
create_album
Removes one face detection row; the underlying asset and the person this face was assigned to are both preserved. **Use `update_face` with `person_id=null` instead** when the user wants to disassociate the face from a person without discarding the detection (so re-clustering can try again). Use `delete_person` to remove a person; use `trash_assets` to remove the photo entirely.
delete_face
Deletes the person record; the faces that were attached to this person are not deleted — they become unassigned and will be re-clustered on the next clustering pass. Use `update_face` with `person_id=null` to detach a specific face without deleting the whole person. Use `delete_face` to remove a face detection entirely. If a concurrent change to the person's faces collides with the deletion, it returns 409 and nothing is deleted; retry the request unchanged.
delete_person
Deletes the album itself. Assets that were in the album remain in the library — only the album and its asset-links are removed. Use `trash_assets` to soft-delete the underlying assets, or `remove_assets_from_album` to detach specific assets from an album you want to keep.
delete_album
Fetches one face's details by ID (bounding box, assigned person, timestamps, thumbnail). Use when you already have a `face_id`. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
get_face
Fetches one library's metadata by ID. Returns the library regardless of trash state.
get_library
Fetches one person's metadata by ID (name, asset count, thumbnail, etc.). Use this when you already have a `person_id`. The JSON response is metadata only; to get the photos that contain this person, use `search_assets` with `person_ids` or `list_assets` with `person_ids`. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
get_person
Fetches one album's metadata by ID (name, description, cover, counts). Use when you already have an album ID. The JSON response is metadata only and does not include the album's assets — to get the asset IDs or data, use `list_album_assets` or `list_assets` with `album_id`. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
get_album
Fetches one album-asset link record by ID (the junction row between an album and an asset). Rarely needed directly; most callers want `get_asset` or `get_album` instead. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
get_album_asset
Fetches one asset and its associated metadata by ID. Use this when you already have a specific asset ID (e.g., from `list_assets`, `search_assets`, or `list_album_assets`) and need its full details. For bulk fetch of multiple known IDs, prefer `list_assets` with the `ids` parameter to avoid N round trips. `asset_urls` are signed URLs for client rendering only; to visually inspect the image pixels, call `view_asset` instead. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
get_asset
Counts assets bucketed by time period — use this to summarize a library (or a filtered slice) without paging through the full timeline. Returns one row per bucket, ordered most-recent-first, with optional filtering by album, person, date range, or trash state. To list the actual assets within a bucket, call `list_assets` with the same filters and a `local_datetime_after` / `local_datetime_before` window matching the bucket. Does not filter by image content or location; for content-based search use `search_assets`. **Pagination:** When `has_more` is true, pass the last `time_bucket` value from `data` as `local_datetime_before` to fetch the next page.
get_asset_counts
Returns the profile of the authenticated user (the caller). Use this at the start of a session to ground subsequent calls (e.g., to confirm the caller's identity before making destructive changes). This tool does not accept a user ID; it always returns the authenticated caller.
get_current_user
Returns paginated *link* records (lightweight join rows between albums and assets) describing which assets are in which albums — each row contains `album_id` + `asset_id` + link timestamps, not the full asset or album metadata. Use this when you specifically need the junction records (for sync or change tracking). **For most use cases you want a different tool:** use `list_assets` with `album_id` to get the full asset metadata for a specific album; use `list_albums` with `asset_id` to find which albums contain an asset. **Pagination** is cursor-based: when `has_more` is true, pass the `id` of the last album-asset in `data` as `starting_after_id` to fetch the next page. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
list_album_assets
Returns a paginated list of albums ordered by creation time (newest first), optionally filtered by asset membership or ID. Use this to enumerate a user's albums or to find which albums contain a specific asset (via `asset_id`). `list_albums` returns album metadata only — to list the assets inside a particular album, use `list_album_assets` or `list_assets` with `album_id`. **Pagination** is cursor-based: when `has_more` is true, pass the `id` of the last album in `data` as `starting_after_id` to fetch the next page. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
list_albums
Returns a paginated list of assets ordered by local capture time (or trash time for trashed assets), newest first by default, optionally filtered by album, person, date range, geographic area, or asset ID. Use this tool for structured browsing and filtering — when the request can be expressed as exact filters on album membership, people, date range, geographic coordinates, or specific asset IDs. **Location filtering is by coordinate:** pass a radius (`center` + `radius`) or a bounding box (`bbox`) to restrict results to a geographic area. The two modes are mutually exclusive. To count or cluster geotagged assets across a map viewport (how many photos fall in each area) rather than list them, use `get_geo_clusters`. Album and person filters compose using AND. **Use `search_assets` instead** when the request involves natural-language image content ('photos of sunsets', 'pictures with my dog'), a place *name* ('photos from Japan'), or any concept requiring semantic understanding of what's in the image. `list_assets` filters by coordinate but not by image content, place name, or caption text. **To present a curated set of specific assets to the user** (e.g., a hand-picked subset of `search_assets` results), call this tool with `ids=[...]` rather than building a custom gallery — the asset IDs you already have are enough to re-render them through the interactive widget. **Pagination** is cursor-based: while `has_more` is true, keep fetching with `starting_after_id`. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
list_assets
Returns a paginated list of individual face detections (with bounding boxes), ordered by creation time (newest first), optionally filtered by asset, person, or ID. Each row is a single face in a single asset — a person with many photos will have many face rows. **Use `list_people` instead** when the user wants the grouped identities ('list everyone in my library') rather than individual face detections. This tool is useful for curating clustering results, finding unassigned faces, or picking a thumbnail face for a person via `update_person.thumbnail_face_id`. **Pagination** is cursor-based: when `has_more` is true, pass the `id` of the last face in `data` as `starting_after_id` to fetch the next page. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
list_faces
Returns libraries owned by the authenticated user (no pagination — users typically have one or a handful). Call this when another tool's `library_id` parameter is required but you don't yet know which libraries exist. A single-library user can usually omit `library_id` on other tools entirely. By default trashed libraries are excluded. Pass `state=trashed` to list the trash drawer (ordered by most recently trashed) or `state=all` for both.
list_libraries
Returns a paginated list of person records, which may be named or unnamed and may have zero or more faces, ordered according to `sort` (newest first by default), optionally filtered by asset, album, name, or ID. By default only people with a non-null name are returned; pass `name_filter=all` for every person or `name_filter=unnamed` for people whose name is null. To list the underlying faces for a specific person, use `list_faces` with `person_id`. **Pagination** is cursor-based: when `has_more` is true, pass the `id` of the last person in `data` as `starting_after_id` to fetch the next page. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
list_people
Merges one or more source people into the primary person identified by the URL. All faces from source people are reassigned to the primary person. Source people are permanently deleted (this cannot be undone). The primary person's centroid embedding is recalculated. In the degenerate case where the primary and all sources are unnamed and have zero faces, the primary is auto-deleted by the post-merge centroid recompute and the response is `204 No Content`.
merge_people
Moves the library and all its contents into the trash. The library becomes inaccessible by default and can be fully restored within 90 days by calling `restore_library`. After 90 days the library's assets are gradually purged in the background; until the library row itself is removed, restore still works but recovers only the assets not yet purged. Idempotent — a second call on an already-trashed library no-ops. To trash individual assets without trashing the whole library, use `trash_assets` instead.
trash_library
Soft-deletes the given assets. Trashed assets are excluded from default list/search results and are purged after the configured retention window. **Reversible** via `restore_assets` until purge. To trash an entire library at once instead of enumerating asset IDs, use `trash_library`.
trash_assets
Detaches one or more assets from the given album. The assets themselves remain in the library and in any other albums they belong to. Use `trash_assets` to soft-delete the asset entirely. To empty an album completely, call `list_album_assets` to get the links and then remove them, or delete the album itself with `delete_album`.
remove_assets_from_album
Restores a previously-trashed library so it reappears in default list/search results. Works as long as the library row still exists — once `get_library` returns 404 the row is gone and restore is no longer possible. If the background drain has already started purging assets, restore succeeds but recovers only the assets the drain hasn't gotten to yet. Pairs with `trash_library`. To restore individual trashed assets within an untrashed library, use `restore_assets` instead.
restore_library
Restores trashed assets so they reappear in default list/search results. Idempotent — assets that are already live are silently skipped. Pairs with `trash_assets`: assets soft-deleted there can be brought back here within the retention window. To restore a whole trashed library, use `restore_library`.
restore_assets
Save a new photo or video into the user's Gumnut library — the write-side counterpart to `view_asset`. Supply the file as `data`: base64-encoded image or video bytes you already have (e.g. an image you generated or edited, or bytes you fetched yourself). Accepts images and videos. Identical files are de-duplicated per library by content checksum: re-saving the same bytes returns the existing asset (`created: false`) rather than a duplicate. After saving, call `get_asset` to display the asset, `update_asset` to set its description or capture date, or `add_assets_to_album` to file it. Does not accept URLs or local file paths — pass the bytes directly.
save_asset
Searches for assets by content, by typed structured filters on albums, people, date range, and location, or both. Content searches are ranked by relevance; filter-only searches return matches newest-first. Use this tool when the user describes *what's in* the photos they want — subjects, scenes, places, activities, moods, objects — optionally narrowed by album, person, date, or location. Prefer typed filters for anything the request states exactly: `album_id` for album membership, `person_ids` for people, `local_datetime_before`/`local_datetime_after` for date ranges, and `center` + `radius` or `bbox` for location. There is no typed camera or place-name filter — pass those terms in the free-text `query`; the metadata full-text stage can match those terms, while dense retrieval adds visual-semantic matches. For example, 'photos of my kids at the beach last summer' becomes `query='kids at the beach'` + `local_datetime_after=2025-06-01` + `local_datetime_before=2025-09-01`. **Use `list_assets` instead** for a plain structured browse that album, person, date-range, location, or asset-ID filters can answer with no content `query` — it's cheaper and more deterministic than semantic search. **Location filtering is by coordinate,** in two mutually-exclusive modes: a radius (`center` + `radius`) or a bounding box (`bbox`). At least one of `query`, `album_id`, `person_ids`, `local_datetime_before`, or `local_datetime_after` must be provided; a location filter only narrows those results and is not a search criterion on its own. Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.
search_assets
Assigns a face to a specific person, or detaches it from its current person (set `person_id` to null). This is the right tool for 'this face is Alice' or 'this face isn't Bob after all'. Currently only the `person_id` field is mutable. To create a brand-new identity first, call `create_person`; to delete the face detection entirely, use `delete_face`.
update_face
Renames a library or changes its description. Only the fields included in the request body are changed. Library contents (assets, albums, people, faces) are not affected.
update_library
Updates a person's name, birth date, visibility, or thumbnail. Only the fields included in the request body are changed. Typical use: assigning a name ('name this face cluster "Alice"') or choosing a better thumbnail. This tool does not move faces between people — use `update_face` with a new `person_id` for that.
update_person
Updates album metadata (name, description, and/or cover). Only the fields included in the request body are changed. To modify the contents of an album, use `add_assets_to_album` / `remove_assets_from_album` instead — this tool only changes album metadata.
update_album
Edits the user-editable metadata for a single asset — description, GPS coordinates, and original capture datetime. Only fields included in the request body are changed; others are left untouched. Passing `null` for a field removes a previously-set value; the effective response may still contain a value from another metadata source. `latitude` and `longitude` must be set together (both written or both cleared). Setting or clearing GPS coordinates schedules an asynchronous refresh of derived location names. For editing multiple assets in one round trip, prefer `bulk_update_assets`.
update_asset
Updates metadata on multiple assets in one transactional call. Each item carries the target asset id and the per-asset change — different fields can be changed on different assets in the same request. Atomic: any per-item validation failure or unknown / cross-user id rejects the whole batch and writes nothing. For a single-asset edit, prefer `update_asset` — semantically identical but slightly more concise at the call site.
bulk_update_assets
Look at an image asset: returns the asset's image pixels so the model can see and analyze it — read text in a screenshot/document/photo, describe what's in it, assess quality, or answer questions about its contents. Use `get_asset` for metadata (JSON) or to display the asset to the user (it renders the interactive widget; `view_asset` does not render a widget). For videos this returns the extracted still frame; if extraction is still pending, the tool returns a ToolError (`isError: true`) saying the video has no extracted still frame yet, so tell the user to retry later. Returns a web-optimized variant, not the original file.
view_asset
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Gumnut Photos alternatives on ChatGPT?
As of 2026-09-10, Gumnut Photos competes with Achriom, emaqi, Interestnaut, memorystore.in, Readplace, Watchr in ChatGPT Personal Media Tracking & Libraries, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.