01 · Overview
What theCam MCP does
The Model Context Protocol (MCP) is an open standard that lets AI assistants use outside tools. theCam's MCP server gives your assistant the same abilities you have in the app — finding pros, booking, chatting and getting support — without ever handing it your password.
- Endpoint
- https://api.thecam.app/user-mcp
- Transport
- Streamable HTTP. The server is stateless and accepts
POSTonly — there is no standalone SSE stream to open. - Authorization
- OAuth 2.1 with PKCE. Sign in with Google, Apple, or email and password, then approve the app. No API keys.
- Access
- Your account only: public pro profiles plus your own bookings, favorites, chats and support requests.
- Tools
- 21 tools — 12 read-only, 9 that make changes. See the full list.
02 · Sign-in & consent
How authorization works
You never create or paste a key. Your AI app sends you to theCam to sign in, you approve it, and theCam gives that app its own revocable access to your account.
Add the endpoint to your AI app
Use one of the setups below. The app contacts theCam, finds its sign-in server and registers itself automatically — there's no client ID or secret for you to copy.
Sign in on theCam's own page
Your browser opens a theCam page. Continue with Google, continue with Apple, or use your email and password — whichever you use for theCam today. Your password is entered on theCam, never in the AI app.
Review the request and choose Allow
The consent screen names the app and what it can do: act as you in theCam to search pros, read your profile, and manage your bookings, favorites, reviews, chats and support requests. Choose Deny and nothing is shared. Apps that registered themselves with an unverified name are flagged — only continue if you started the connection.
The app receives short-lived access
The app gets an access token that lasts 15 minutes and a refresh token it uses to stay connected. Both are bound to your account and that one app. Every call is made as you, with your permissions.
Staying connected
Access tokens refresh automatically, and each refresh token works only once. A connection that goes unused for 30 days expires, and every connection needs a fresh sign-in at least every 90 days.
Disconnecting
Remove theCam from your AI app; apps that support token revocation cut access off immediately. To disconnect every app at once, or if something looks wrong, contact support and we'll revoke your connections.
03 · Connect a client
Connect your AI app
Every client uses the same endpoint. Pick yours below; each one opens theCam's sign-in page the first time it connects.
https://api.thecam.app/user-mcpClaude Code
CLI commandAdd theCam as a remote HTTP server, then sign in from inside Claude Code.
- Run the command below. Add
--scope userto make theCam available in every project. - Start Claude Code, run
/mcp, pickthecamand choose Authenticate. - Your browser opens theCam's sign-in page. Sign in, review the request and choose Allow.
claude mcp add --transport http thecam https://api.thecam.app/user-mcpClaude Desktop & claude.ai
Custom connectorClaude's apps connect to remote servers as custom connectors. Connectors you add at claude.ai also show up in Claude Code when you're signed in with the same account.
- Open Claude's settings and go to Connectors, then choose Add custom connector.
- Name it theCam and paste the endpoint URL below.
- Choose Connect. Claude opens theCam's sign-in page; sign in and choose Allow.
https://api.thecam.app/user-mcpMenu names differ slightly between Claude versions, and custom connectors depend on your Claude plan.
OpenAI Codex
CLI commandCodex CLI and the Codex IDE extension share ~/.codex/config.toml.
- Add the server with the command below, or add the config.toml entry by hand.
- Run
codex mcp login thecam. Codex opens your browser to theCam's sign-in page. - Sign in and choose Allow, then start Codex.
codex mcp add thecam --url https://api.thecam.app/user-mcp
codex mcp login thecam[mcp_servers.thecam]
url = "https://api.thecam.app/user-mcp"ChatGPT
Where availableWhere your ChatGPT plan supports custom MCP servers, add theCam as a Streamable HTTP server using the endpoint URL and choose OAuth when asked how to authenticate.
- Find the option to add an MCP server or custom connector in ChatGPT's settings.
- Choose Streamable HTTP (or remote) and paste the endpoint URL below.
- Choose OAuth for authentication, then sign in to theCam and choose Allow.
https://api.thecam.app/user-mcpAvailability and menu names depend on your plan and app version. theCam doesn't need a client ID or secret — ChatGPT registers itself.
Cursor
mcp.jsonAdd theCam to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json in one project.
- Add the entry below and save the file.
- Open Cursor's MCP settings. When theCam asks for sign-in, choose to log in.
- Sign in in the browser window and choose Allow.
{
"mcpServers": {
"thecam": {
"url": "https://api.thecam.app/user-mcp"
}
}
}No headers or API key are needed — leave the headers field out.
VS Code
mcp.jsonAdd theCam to .vscode/mcp.json in a workspace, or run MCP: Add Server from the Command Palette and choose HTTP.
- Add the entry below and save the file.
- Start the server from the file or the MCP servers list. VS Code asks you to sign in when theCam requests it.
- Sign in in the browser and choose Allow.
{
"servers": {
"thecam": {
"type": "http",
"url": "https://api.thecam.app/user-mcp"
}
}
}Any Streamable HTTP client
Protocol referenceClients that implement the MCP authorization spec connect with just the URL. If you're building one, this is what the server expects:
- RequestsJSON-RPC 2.0 over
POSTwithContent-Type: application/jsonandAccept: application/json, text/event-stream. Bodies are limited to 64 KB. - DiscoveryAn unauthenticated call returns
401with aWWW-Authenticateheader pointing at the protected resource metadata (RFC 9728), which names the authorization server (RFC 8414 metadata). - RegistrationPublic clients only: dynamic client registration (RFC 7591) or an https Client ID Metadata Document URL as the
client_id. - AuthorizationAuthorization code with PKCE
S256(required). Sendresource=https://api.thecam.app/user-mcpand scopeuser:mcp. Redirect URIs must match your registration exactly; loopbackhttpredirects may use any port. - TokensBearer access tokens in the
Authorizationheader. Refresh tokens rotate on every use; reusing an old one revokes the whole connection.
curl https://api.thecam.app/.well-known/oauth-protected-resource/user-mcpOnly speaks stdio? The community-maintained mcp-remote package can bridge a local stdio client to a remote server and handles the OAuth sign-in in your browser. It isn't published or supported by theCam.
npx -y mcp-remote https://api.thecam.app/user-mcpMetadata URL: https://api.thecam.app/.well-known/oauth-protected-resource/user-mcp
04 · Tools
All 21 tools, by workflow
Tool names are exact — they're what your AI app shows when it asks to use one. Read tools only look things up. Write tools change something in your account.
How write tools stay safe
- Every write tool requires an
idempotencyKey: 16–128 printable ASCII characters, unique per action (a UUID works well). Retrying with the same key and the same arguments returns the original result instead of acting twice; the same key with different arguments is refused. Keys last 24 hours. Don't put personal details in them. - Write tools are marked as non-read-only and destructive, so clients that support confirmations ask you before running them. Keep those prompts switched on, and ask your assistant to read back bookings and messages before it sends them.
- Your assistant only acts when it calls a tool. Nothing runs in the background, and no tool takes payment.
Your account
Confirm which theCam account the assistant is acting as.
whoamiReadReturns your profile: name, email, whether you're a client, photographer or videographer, and whether onboarding is complete.
Arguments: none
Find a pro
Search the marketplace and look at a pro's work, prices and calendar.
search_prosReadSearches public, available photographers and videographers by text (name, bio, city, state) or by latitude/longitude within a 1–100 mile radius. Sort by nearest, top rated or best value; up to 50 results per page, paged with a cursor.
Arguments: query, latitude, longitude, radius, sort, limit, cursor
get_proReadGets a pro's public profile: display name, bio, city, state, photo/video flags and profile image.
Arguments: proId
get_pro_servicesReadLists the services and packages a pro offers, with pricing.
Arguments: proId
get_pro_availabilityReadReturns the pro's availability calendar.
Arguments: proId
get_pro_portfolioReadReturns the pro's portfolio images and work samples in display order.
Arguments: proId
get_pro_reviewsReadReturns the pro's reviews with ratings and comments.
Arguments: proId
Favorites
Keep a shortlist of pros you like.
list_favoritesReadLists the pros you've favorited.
Arguments: none
add_favoriteWriteAdds a pro to your favorites.
Arguments: proId, idempotencyKey
remove_favoriteWriteRemoves a pro from your favorites.
Arguments: proId, idempotencyKey
Bookings
Request a shoot and keep track of the ones you have.
list_bookingsReadLists your bookings — as the client, or as the pro if you're a photographer or videographer. Filter by upcoming, past or pending.
Arguments: status
get_bookingReadGets one booking you're part of, including services, schedule and any dispute status.
Arguments: bookingId
create_bookingWriteCreates a booking draft with a verified pro: date and time, 1–20 services or a package, notes, shoot locations and intake answers. Returns provisional pricing and the deposit; the draft is held for 15 minutes and no payment is taken by this tool.
Arguments: photographerId, scheduledAt, services, packageId, notes, shootLocation, cancelPolicy, intakeAnswers, bookingLocations, idempotencyKey
cancel_bookingWriteCancels a booking you're part of. Bookings that are completed or already have delivered work can't be cancelled.
Arguments: bookingId, idempotencyKey
Messages
Talk to pros through theCam chat, the same threads you see in the app.
list_conversationsReadLists your active chat conversations.
Arguments: none
get_messagesReadReturns the message history of one of your conversations.
Arguments: conversationId
start_chatWriteOpens a conversation with a pro, or returns the existing one if you've already talked.
Arguments: proId, idempotencyKey
send_messageWriteSends a message (up to 5,000 characters) in one of your conversations.
Arguments: conversationId, message, idempotencyKey
After the shoot
Review the work, or raise a problem with a delivery.
create_reviewWriteLeaves a 1–5 star review with a comment (up to 1,000 characters) for the pro on one of your completed bookings.
Arguments: bookingId, rating, comment, idempotencyKey
dispute_bookingWriteOpens a dispute on a booking whose delivery is awaiting your review, with a reason of up to 500 characters.
Arguments: bookingId, reason, idempotencyKey
Support
Reach theCam support.
open_support_requestWriteOpens a support ticket with a subject, description and category: booking, payment, account, technical or other.
Arguments: subject, description, category, idempotencyKey
05 · Examples
What it looks like in practice
Ask in plain language — your assistant picks the tools. These show the tool calls behind common requests. IDs in angle brackets come from earlier results.
Find a photographer
“Find a highly rated portrait photographer within 15 miles of downtown Austin and show me their work.”
Tools called
search_prossearches by coordinates, sorted by ratingget_pro_portfoliopulls work samples for the top matchesget_pro_reviewssummarizes what past clients saidadd_favoriteoptional — saves one to your shortlist, after asking
{
"latitude": 30.2672,
"longitude": -97.7431,
"radius": 15,
"sort": "top_rated",
"limit": 5
}Prefer words to coordinates? { "query": "Austin" } matches names, bios, cities and states. Each search needs a query, a latitude/longitude pair, or both.
Check availability and prices
“Is Jordan free on a Saturday morning in June, and what does a portrait session cost?”
Tools called
get_pro_availabilityreads Jordan's calendarget_pro_serviceslists services and packages with prices
{
"proId": "<proId from search_pros>"
}Create and manage a booking
“Book Jordan's portrait session for June 14 at 10 a.m. at Zilker Park. It's for four people.”
Tools called
get_pro_servicesfinds the portrait service IDcreate_bookingafter reading the details back to you for confirmationlist_bookingslater: status "upcoming" shows what's scheduledget_booking / cancel_bookingcheck one booking, or cancel it after you confirm
{
"photographerId": "<proId>",
"scheduledAt": 1812985200000,
"services": [
{
"photographerServiceId": "<serviceId from get_pro_services>"
}
],
"shootLocation": "Zilker Park, Austin, TX",
"notes": "Family portraits, four people.",
"idempotencyKey": "7f3c9a2e-5b1d-4e8f-a6c4-0d2b9e1f7a53"
}scheduledAt is Unix time in milliseconds (this one is 10 a.m. Central). The tool returns a draft with provisional pricing and the deposit, held for 15 minutes; it doesn't charge you. Only verified pros can be booked.
Message a pro
“Ask Jordan if we can move the shoot to golden hour.”
Tools called
list_conversationslooks for an existing thread with Jordanstart_chatopens one if there isn't — or returns the existing threadsend_messagesends the message you approvedget_messageslater: reads the reply
{
"conversationId": "<conversationId from start_chat>",
"message": "Hi Jordan — could we move Saturday's shoot to golden hour, around 7:30 p.m.?",
"idempotencyKey": "c1d8e4a7-2f60-4b93-9e15-8a7b3c0d6f21"
}Messages land in the same theCam chat you use in the app, so you can pick the conversation up on your phone.
Get support or dispute a delivery
“The gallery I received is missing the second location we booked. Open a dispute — and tell support my card was charged twice.”
Tools called
get_bookingconfirms the booking and its delivery statusdispute_bookingopens a dispute while the delivery awaits your reviewopen_support_requestfiles a payment ticket with the details
{
"bookingId": "<bookingId>",
"reason": "Delivery is missing photos from the second booked location.",
"idempotencyKey": "0b9e6f3a-8c24-4d71-b5a2-e3f1c7d49a86"
}
{
"subject": "Charged twice for one booking",
"description": "My card shows two deposit charges for the same booking.",
"category": "payment",
"idempotencyKey": "5a2c7e91-3d4b-4f08-a6e2-9b1d0c8f7e34"
}Support categories: booking, payment, account, technical or other.
06 · Security & privacy
Built to act as you — and only you
No API keys, no shared passwords
You sign in on theCam's page. The AI app never sees your password and there's no long-lived key to leak.
Explicit consent, per app
Each app must be approved by you on theCam's consent screen before it gets any access. Unverified app names are flagged.
User-scoped by design
Every tool runs as your account. It can read public pro profiles and your own bookings, favorites and conversations — never another user's data, and never admin operations.
Short-lived, rotating tokens
Access tokens last 15 minutes. Refresh tokens rotate on each use, and replaying an old one revokes the whole connection.
Minimal data
Search returns public profile fields only. Credentials and sign-in parameters are kept out of logs, and tokens are stored only as one-way digests.
Safe retries
Idempotency keys stop a retried request from booking or messaging twice. Errors come back as short, generic messages.
You stay in control
Disconnect any app from the app itself, or contact support to revoke every connection at once.
07 · Troubleshooting
When a connection doesn't work
I can't sign in on theCam's page
The connection page signs in to an existing theCam account — it can't create one. If you're new, create your account first, then connect again.
Use the same method you normally use: if you joined with Google or Apple, choose that button rather than email and password. After too many attempts, sign-in is paused briefly — wait a few minutes and try again.
Google or Apple says “We couldn't verify that sign-in”
Try again, or use another method. If you signed up with Apple's Hide My Email, continue with Apple — that relay address can't be matched through a different sign-in method. Accounts protected by an extra sign-in factor can't be connected from this page yet.
“Request expired” or “Sign-in expired”
Each connection request is valid for 10 minutes and can be used once. Close the old tab, go back to your AI app and start connecting again. Don't reuse bookmarked or shared sign-in links.
I chose Deny, or closed the consent screen
Nothing was shared. Start the connection again from your AI app when you're ready and choose Allow.
After choosing Allow, the browser can't reach localhost or 127.0.0.1
Desktop and command-line apps receive the result on a temporary address on your own computer, such as http://127.0.0.1:<port>/callback. That page is served by the app itself and the result never leaves your machine; the port can differ each time.
If it won't load, the app stopped listening — it was closed, restarted or timed out. Keep it open, start the connection again, and finish sign-in in a browser on the same computer (not a phone or another machine, and not across an SSH session).
“Invalid redirect”, “Unknown client” or “Invalid request”
theCam couldn't verify the app's registration, so it stopped before sending anything back. This is an app setup problem, not your account: update the app, remove theCam and add it again, and check the endpoint is exactly https://api.thecam.app/user-mcp.
“Account unavailable”
This account can't authorize apps right now, for example while it's suspended. Contact support for help.
Tools stopped working, or I see “Invalid session”
The connection expired, was disconnected, or was revoked. Reconnect to sign in again:
- Claude Code: run
/mcp, pickthecamand authenticate. - Codex: run
codex mcp login thecam. - Other apps: use the app's reconnect or sign-in option, or remove theCam and add it again.
The assistant can't find a pro, or can't book them
Search only returns pros who are available and have finished setting up their profile. Each search needs a text query or both latitude and longitude. Pros who haven't completed verification can be viewed but not booked yet.
08 · FAQ
Questions, answered
Do I need an API key?
No. You sign in with OAuth in your browser. There's nothing to generate or paste.
Can my assistant pay for a booking?
No. create_booking returns a draft with provisional pricing and the deposit. No MCP tool takes payment.
Can it see other people's bookings or messages?
No. It sees public pro profiles and your own account data only — the same things you can see when you're signed in.
I'm a photographer. Is this useful to me?
Partly. list_bookings and get_booking show bookings where you're the pro, and chat works both ways. Most other tools are built for finding and booking pros.
Which AI apps work?
Any MCP client that supports remote Streamable HTTP servers with OAuth — including Claude, Codex, Cursor and VS Code. Stdio-only apps can use a bridge; see Any Streamable HTTP client.
How do I disconnect an app?
Remove theCam from the app. To revoke every connection at once, contact support. Connections you don't use expire on their own after 30 days.
Rather browse yourself?
Everything the MCP can do, you can do on theCam.