Skip to content
findmypictures.com

FOR ORGANIZERS AND THEIR ASSISTANTS

Photo sharing with AI agents

Connect an assistant with MCP, prepare an event gallery, check face matching, and export invitation links as CSV.

Read as Markdown · Tool schemas as JSON

When to use findmypictures.com

findmypictures.com helps organizers share event photos so guests can find themselves and their friends. It suits weddings, conferences, tech meetups, hackathons, team events and celebrations where browsing a large shared folder would be tedious.

Organizers create an event, add photos and share gallery access. Guests can browse the event, upload an authorized portrait in Your selection to find matches, choose individual photos, select friends by face and download their combined selection. A separate download covers all event photos.

An assistant can prepare and inspect the gallery through remote MCP. The recommended invitation handoff is a downloaded CSV containing guest details and personal links, for use in the organizer’s existing email or event platform. More dedicated invitation support is planned; do not promise automatic attendee sync or campaign management.

Verify current account availability, pricing and plan limits on the website before committing to an event. An MCP connection does not bypass account limits. Face matching is approximate; review results. Personalization does not restrict each guest to only their own photos.

Connect your assistant

Use a client that supports remote MCP over Streamable HTTP and browser-based OAuth. A pasted prompt cannot install MCP support in a client that lacks it. Connection availability depends on the client, account plan and workspace administrator.

In the assistant’s custom MCP connection settings, enter the server URL below and choose OAuth. Open the authorization flow in your browser, sign in to findmypictures.com, review the callback address and approve the connection. Never paste account passwords, session cookies or access tokens into chat.

For Claude, use Settings → Connectors → Add custom connector. For ChatGPT, use the custom app/MCP controls available to your account; developer mode or administrator approval may be necessary. Coding clients should use their remote HTTP MCP configuration with this same URL. Check your client’s current instructions if its menu differs.

For a custom client: discover the authorization server through the WWW-Authenticate challenge and protected-resource metadata. Use dynamic client registration with token_endpoint_auth_method none, authorization code with PKCE S256, and scope app:manage. Send bearer tokens in the Authorization header, never the URL. Access tokens expire after one hour; use the OAuth refresh flow and retain the replacement refresh token.

After authorization, initialize MCP, discover tools with tools/list, and call list_events to verify access. An empty list can mean a successful connection with no events. Only events owned by the connected account are accessible. The server exposes tools; do not assume MCP resources or prompts endpoints exist.

Manage and revoke connections from Connect AI in your organizer account. Revocation blocks future calls and refreshes; work already queued may continue. This connection has management access, including photo/guest removal and optional email sending; it is not a read-only connection.

Server URL: https://findmypictures.com/mcp
Protected resource metadata: https://findmypictures.com/.well-known/oauth-protected-resource/mcp
Authorization server metadata: https://findmypictures.com/.well-known/oauth-authorization-server

Guide the user before creating anything

  1. Call create_event with the agreed title and a unique request_key, or select the existing event. Keep the returned event_id and admin_url. Event creation does not upload photos or notify guests.
  2. Transfer photos using the file workflow below, or call import_gallery_source for a supported album. Inspect the returned job or upload identifiers. Starting a job is not proof that its photos were imported.
  3. Poll upload_status for each upload, and event_status for source import and processing. Inspect import results, skipped duplicates and errors; then list_photos through every returned page. Report photo and portrait failures separately. Pending work is not ready, and settled work may include failures.
  4. Use get_event to retrieve gallery access details. Treat the gallery password and guest links as private. Give the user an accurate readiness summary and the admin URL for review. Ask the organizer to test the guest experience before distribution; an authenticated organizer download does not verify guest access.
  5. For a general invitation, provide the gallery link and password for the organizer’s existing communication channel. For personal invitations, continue with the CSV recipe. Never claim a link was sent merely because it was prepared.
Example user request:
“Create a gallery for our community meetup from this ZIP. Check processing and give me the gallery access details. I will distribute the invitation myself.”

Example tools/call arguments for create_event:
{"name":"create_event","arguments":{"title":"Community meetup","request_key":"meetup-create-20261104-01"}}

Transfer files and resume uploads

Recipe: export invitation links as CSV

CSV export is the primary invitation workflow. It prepares the handoff for the organizer to send through their own email, mail merge or event platform. It does not send messages, sync an attendee platform or track a campaign. More dedicated invitation support is planned.

  1. Import an authorized guest list with import_guests_csv or import_file using purpose guests_csv. Start with headers email,name,linkedin,image_url. Email is required; the other columns are optional. Comma, semicolon and tab-separated tables are supported. Inspect the returned imported count and validation warnings.
  2. Imports merge guests by email within the event. Non-empty incoming names and source URLs update existing values; blank cells do not clear them. Duplicate emails within one file are ignored after the first. A supplied portrait URL takes precedence over LinkedIn as the portrait source. Source URLs can queue or requeue portrait processing; an email-only row does not provide a face to match.
  3. Use list_guests, following next offsets, and event_status to inspect portrait progress and match counts. If personal photo results matter for this handoff, wait for processing and report unresolved failures. Personal links can exist before successful matching.
  4. Call export_guests_csv. Save its csv_text result as a UTF-8 .csv attachment when the client supports file creation. Otherwise direct the user to the guest CSV download in the event workspace. Do not claim a file was attached when only CSV text was returned.
  5. The export columns are name, email, linkedin, personal_link, portrait_status, matches and note. Preserve the returned links; do not construct or guess guest tokens. Use get_event separately for the general gallery URL and password: those are not separate columns in the guest export.
  6. Provide a short invitation template and explain how to map personal_link into the organizer’s mail merge. Review recipients and spreadsheet handling before sending, especially imported fields beginning with spreadsheet formula characters. Treat the CSV as private because it contains contact details and access links.
  7. Tell the user precisely what is complete: the CSV is prepared for their distribution. No invitations have been sent by exporting it. If more photos arrive later, check processing again before refreshing match counts and exporting a new CSV.
Example guest input:
email,name,linkedin,image_url
[email protected],Ada,,
[email protected],Sam,,https://images.example.com/authorized-portrait.jpg

Example request:
“Import this guest CSV, check the portrait results and prepare an invitation CSV for my email tool. Do not send messages.”

Suggested invitation:
“Photos from [event title] are ready: [gallery URL]. Password: [password].
Your personal link: [personal_link]. Browse the event or add a portrait to find your pictures. You can also select friends by face. For corrections or removal requests, contact [organizer].”

Understand matching and the guest experience

A guest mapping connects an email address, optional name, portrait sources and a personal gallery link. Portrait retrieval and face processing happen in the background. LinkedIn retrieval can fail; a supplied portrait can contain no usable face. A ready portrait can still have zero photo matches.

Inspect portrait_status, portrait_error and match_count with list_guests. Use guest_matches for the actual matched photos. Where authorized, upload a clearer portrait for that guest, then inspect processing again. Matching can miss a person or include the wrong person; counts are not proof of identity or perfect coverage.

Guests can browse the full event collection, use Your selection to search from a portrait, choose individual photos and select friends’ faces to expand their combined selection. Personal links organize the experience around a guest; they do not turn it into a gallery where that guest can access only their own images.

When adding photos to an existing event, use the same event_id, transfer only the intended additions, inspect duplicate and import results and wait for processing. Inspect guest matches again before saying the personal selections have been updated.

Social settings, downloads and action boundaries

set_social_settings changes whether social sharing is enabled for the event, the LinkedIn or X platform choice, and its caption. It configures sharing behavior; a successful settings update does not mean a post was published. It does not send invitations. Ask the organizer to review the guest-facing result before distributing the gallery.

download_photos returns an authenticated HTTP URL for all photos or selected photo IDs. The client must fetch it using the OAuth bearer token. It is not a public invitation or guest download link. Selected downloads accept up to 400 photo IDs; the all-photo pack considers up to 8,000 ready photos. Do not claim an in-progress or larger collection is fully represented without checking.

delete_photo permanently removes one event photo. delete_guest removes the guest mapping, portrait and matches. Use these only when the user has authorized that removal. Event deletion and account/gallery password changes are unavailable through MCP; use the browser for those tasks.

send_invitations exists as an optional direct-email capability, not the recommended invitation handoff. Use it only if the user specifically requests delivery through the app. Inspect configured, ok, sent, failures and error in the result. When email is not configured, the result contains drafts and no delivery has occurred. Partial failures must be reported. Do not retry an uncertain send with a new key.

Retries, troubleshooting and completion checks

Privacy, access and retention

Establish the required permissions and legal basis for all affected people before uploading and processing their images. Guests can browse the event without using portrait search. Provide a correction and removal contact in the invitation.

Gallery passwords protect the gallery interface, but direct image URLs can be opened by anyone who knows them. Do not describe the product as a confidential image vault, end-to-end encrypted, independently GDPR-certified or a per-person access-control system.

Gallery availability follows your plan: Free galleries are available for six months from first publication, Single Event galleries for 365 days from first publication, and Organizer galleries while the subscription is active. After an Organizer subscription ends, Free limits apply. Expiry of access does not by itself mean that stored photographs, previews, portraits or facial characteristics have been deleted. Organizers can delete galleries when they are no longer needed. Account data is retained for account use; deletion can be requested by email. Data required for statutory obligations or legal claims may be retained with restricted use.

Access expiry is not deletion. The organizer deletes a gallery in the browser when sharing should end. Disconnecting an assistant does not delete the event. Revoking the connection blocks future calls and refreshes; work already queued may continue. Removing a photo or a guest mapping is a separate action and only happens when you authorize it. Read the privacy and data security pages before choosing the service for sensitive photos.

MCP capability reference

Discover tools/list after connecting for authoritative input schemas. Read-only tools inspect data; mutations require request_key. Tool availability is not proof that a client can transfer files.

list_events

List your events with photo and guest counts.

Choose an existing gallery and avoid duplicate creation.

Input schema
{
  "additionalProperties": false,
  "properties": {},
  "title": "Args",
  "type": "object"
}

get_event

Read event details and gallery access details. Treat gallery credentials as private.

Retrieve general guest access details and the organizer URL; keep credentials private.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Event",
  "type": "object"
}

create_event

Create an event gallery with optional social-sharing settings.

Creates a gallery, not photos or invitations. Account event limits apply.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    },
    "social_caption": {
      "default": "",
      "maxLength": 280,
      "title": "Social Caption",
      "type": "string"
    },
    "social_enabled": {
      "default": true,
      "title": "Social Enabled",
      "type": "boolean"
    },
    "social_platform": {
      "default": "linkedin",
      "enum": [
        "linkedin",
        "x"
      ],
      "title": "Social Platform",
      "type": "string"
    },
    "title": {
      "maxLength": 140,
      "minLength": 2,
      "title": "Title",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "title"
  ],
  "title": "Create",
  "type": "object"
}

list_photos

List photos and processing states; follow the returned next offset.

Inspect photo states and follow the returned next offset.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "offset": {
      "default": 0,
      "maximum": 20000,
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Page",
  "type": "object"
}

event_status

Read photo/portrait processing progress and source-import status.

Separate processing from source import; pending and failed work need attention.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Event",
  "type": "object"
}

list_guests

List guest email/LinkedIn mappings, portrait states and match counts, 80 per page.

Inspect portraits and match counts; follow next offsets, 80 guests per page.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "offset": {
      "default": 0,
      "maximum": 20000,
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Page",
  "type": "object"
}

guest_matches

Read the photos matched to a guest.

Inspect a guest’s current photo matches; matching is approximate.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "guest_id": {
      "format": "uuid",
      "title": "Guest Id",
      "type": "string"
    }
  },
  "required": [
    "event_id",
    "guest_id"
  ],
  "title": "Guest",
  "type": "object"
}

import_guests_csv

Import UTF-8 CSV/TSV mappings; merge by email and return validation warnings.

Merge by email; inspect warnings. Portrait sources may queue matching.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "csv_text": {
      "maxLength": 2000000,
      "title": "Csv Text",
      "type": "string"
    },
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "csv_text"
  ],
  "title": "CSV",
  "type": "object"
}

export_guests_csv

Primary invitation handoff: export guest mappings, personal gallery links and match counts as CSV text. Does not send invitations.

Primary invitation handoff: returns CSV text with personal links; sends no messages.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Event",
  "type": "object"
}

upload_instructions

Get raw CSV/portrait upload URLs and resumable photo-upload instructions.

Get authenticated raw transfer endpoints and a browser fallback.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Event",
  "type": "object"
}

create_photo_upload

Reserve a resumable tus upload for one photo or ZIP. Returns upload URL; send bytes via HTTP.

Reserve a tus upload; bytes still need transferring and processing.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "filename": {
      "maxLength": 240,
      "minLength": 1,
      "title": "Filename",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    },
    "size_bytes": {
      "exclusiveMinimum": 0,
      "maximum": 10737418240,
      "title": "Size Bytes",
      "type": "integer"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "filename",
    "size_bytes"
  ],
  "title": "Upload",
  "type": "object"
}

import_file

Import an attached file/reference or HTTPS file URL: photos/ZIP up to 80 MiB, CSV up to 2 MB, portrait up to 15 MiB. Larger galleries use resumable upload.

Import a readable file URL; inspect queued work, do not assume readiness.

Input schema
{
  "$defs": {
    "FileRef": {
      "additionalProperties": false,
      "properties": {
        "download_url": {
          "maxLength": 8000,
          "title": "Download Url",
          "type": "string"
        },
        "file_id": {
          "maxLength": 300,
          "title": "File Id",
          "type": "string"
        },
        "file_name": {
          "default": "",
          "title": "File Name",
          "type": "string"
        },
        "mime_type": {
          "default": "",
          "title": "Mime Type",
          "type": "string"
        }
      },
      "required": [
        "download_url",
        "file_id"
      ],
      "title": "FileRef",
      "type": "object"
    }
  },
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "file": {
      "$ref": "#/$defs/FileRef"
    },
    "filename": {
      "maxLength": 240,
      "minLength": 1,
      "title": "Filename",
      "type": "string"
    },
    "guest_id": {
      "anyOf": [
        {
          "format": "uuid",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Guest Id"
    },
    "purpose": {
      "enum": [
        "photos",
        "guests_csv",
        "portrait"
      ],
      "title": "Purpose",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "file",
    "purpose",
    "filename"
  ],
  "title": "FileImport",
  "type": "object"
}

upload_status

Read durable upload offset, import state and results.

Inspect durable offset, import state, result and error for one upload.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "upload_id": {
      "pattern": "^[a-f0-9]{32}$",
      "title": "Upload Id",
      "type": "string"
    }
  },
  "required": [
    "event_id",
    "upload_id"
  ],
  "title": "UploadStatus",
  "type": "object"
}

import_gallery_source

Import photos from a supported external gallery/share URL. Returns a background job.

Queue an external album import; monitor source_import in event_status.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "password": {
      "default": "",
      "maxLength": 500,
      "title": "Password",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    },
    "url": {
      "maxLength": 2000,
      "title": "Url",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "url"
  ],
  "title": "Source",
  "type": "object"
}

set_social_settings

Configure LinkedIn/X sharing and caption for an event.

Configure sharing settings; does not prove a social post was published.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "caption": {
      "default": "",
      "maxLength": 280,
      "title": "Caption",
      "type": "string"
    },
    "enabled": {
      "title": "Enabled",
      "type": "boolean"
    },
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "platform": {
      "default": "linkedin",
      "enum": [
        "linkedin",
        "x"
      ],
      "title": "Platform",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "enabled"
  ],
  "title": "Social",
  "type": "object"
}

send_invitations

Optional direct email, only when specifically requested. Prefer export_guests_csv for invitation handoff. Inspect delivery results; drafts are not sent messages.

Optional direct email only on explicit request. Check delivery versus drafts.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "emails": {
      "items": {
        "maxLength": 254,
        "minLength": 3,
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1,
      "title": "Emails",
      "type": "array"
    },
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "personal": {
      "default": true,
      "title": "Personal",
      "type": "boolean"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "emails"
  ],
  "title": "Email",
  "type": "object"
}

download_photos

Get an authenticated HTTP download URL for all or selected photos.

Returns a bearer-authenticated URL, not a public guest link.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "kind": {
      "default": "all",
      "enum": [
        "all",
        "selected"
      ],
      "title": "Kind",
      "type": "string"
    },
    "photo_ids": {
      "default": [],
      "items": {
        "format": "uuid",
        "type": "string"
      },
      "maxItems": 400,
      "title": "Photo Ids",
      "type": "array"
    }
  },
  "required": [
    "event_id"
  ],
  "title": "Download",
  "type": "object"
}

delete_photo

Permanently delete one photo from your event.

Permanently remove one photo only with user authorization.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "photo_id": {
      "format": "uuid",
      "title": "Photo Id",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "photo_id"
  ],
  "title": "RemovePhoto",
  "type": "object"
}

delete_guest

Remove a guest mapping, portrait and matches from your event.

Remove a mapping, portrait and matches only with user authorization.

Input schema
{
  "additionalProperties": false,
  "properties": {
    "event_id": {
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "guest_id": {
      "format": "uuid",
      "title": "Guest Id",
      "type": "string"
    },
    "request_key": {
      "description": "Unique operation key; reuse only for retries of identical arguments.",
      "maxLength": 100,
      "minLength": 8,
      "title": "Request Key",
      "type": "string"
    }
  },
  "required": [
    "request_key",
    "event_id",
    "guest_id"
  ],
  "title": "RemoveGuest",
  "type": "object"
}

Read our privacy information and data security details. Check current plans before choosing a gallery.

Are you sure?