Reel Estate MCP
Official# reel-estate-mcp
**Turn real-estate listing photos into cinematic property videos from your AI
assistant.** `reel-estate-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io)
(MCP) server that connects **Claude, Cursor, and other AI assistants** to your
[**Reel Estate**](https://tryreelestate.com) account โ so you can generate motion
clips, AI-edit photos (virtual staging, twilight, seasonal), add voiceover, and
render finished listing videos, all in plain language.
> Reel Estate is the AI real-estate video platform that turns property photos into
> scroll-stopping listing videos. Create a free account at
> **[tryreelestate.com](https://tryreelestate.com)**.
You sign in once through your browser (OAuth + PKCE โ **no API keys, no secrets**),
and every call is proxied through the backend's `/mcp` endpoint, which stays the
single authority for auth, plans, and permissions. This bridge's one superpower on
top of that: it can read **local image files** and stream them straight into a
project โ something a purely remote server can't do.
- ๐ฌ **Generate real-estate videos** โ animate photos into clips, then render the movie
- ๐ผ๏ธ **AI photo editing** โ virtual staging, twilight, upscale, seasonal, replace/remove/add
- ๐๏ธ **Voiceover & timeline** โ narration, music, overlays, reordering
- ๐ค **Local uploads** โ push photos from disk into a project
- ๐ **Browser sign-in** โ public OAuth client + PKCE; nothing secret stored
- ๐ค **Works with** Claude Code, Claude Desktop, and Cursor
## Requirements
- **Node.js 18+**
- A **[Reel Estate](https://tryreelestate.com) account** (a **paid plan** is
required to create/generate/render; free accounts are read-only over the MCP)
- An MCP-compatible client: **Claude Code**, **Claude Desktop**, or **Cursor**
## Install
Nothing to clone or build โ your MCP client launches it on demand via `npx`. You
only need **Node.js โฅ 18**. (Prefer a global command? `npm install -g reel-estate-mcp`,
then use `reel-estate-mcp` in place of `npx -y reel-estate-mcp` below.)
## Connect your assistant
**Zero config** โ the bridge connects to Reel Estate and handles browser sign-in
for you. There's nothing to set up.
### Claude Code
```bash
claude mcp add reel-estate -- npx -y reel-estate-mcp
```
### Claude Desktop / Cursor
Add to your client's MCP config (`claude_desktop_config.json`, `~/.cursor/mcp.json`):
```json
{
"mcpServers": {
"reel-estate": {
"command": "npx",
"args": ["-y", "reel-estate-mcp"]
}
}
}
```
## First run โ sign in
The first tool call opens your browser to sign in with your Reel Estate account
(Clerk OAuth, authorization code + PKCE). After you approve, the browser returns to
`http://localhost:8765/callback`, tokens cache under `~/.reel-estate-mcp`, and
you're in โ you won't log in again until the token expires.
Start with **`whoami`** to confirm auth and see your plan, then just ask:
- *"List my recent projects."*
- *"Create a project for 123 Main St and upload the photos in ./listing."*
- *"Virtually stage the living room photo, generate a drone clip, then render in 9:16."*
- *"How many credits and exports do I have left?"*
To switch users or re-authorize, run **`logout`** (revokes server-side + clears
the cache) or delete `~/.reel-estate-mcp`.
## Tools
All API tools proxy through the backend's `/mcp` `api_request`, so the backend's
own authorization and plan rules apply.
| Tool | What it does |
| --- | --- |
| `help` | Guided, always-current walkthrough (also the `getting_started` prompt) |
| `whoami` | Confirm auth; reports `plan`, `canWrite`, and a `writeAccess` reason. **Run first.** |
| `login` / `logout` | Start browser sign-in / clear the session (server revoke + local cache) |
| `list_projects` ยท `get_project` ยท `project_stats` | Browse projects |
| `list_clips` ยท `list_movies` ยท `list_voices` | Browse clips, rendered movies, TTS voices |
| `resolve_address` | Geocode a free-text address โ ranked candidates (for real-listing projects) |
| `add_image_from_file` | Upload a **local** image into a project (presigned upload โ no storage creds) |
| `generate_clip` ยท `get_clip_status` | Animate a photo into a video clip (Runway); poll the job |
| `edit_image` | AI photo edit โ virtual staging, twilight, upscale, seasonal, replace/remove/add, manual |
| `add_timeline_audio` ยท `add_timeline_overlay` | Place voiceover/music/audio or an image/text overlay |
| `move_timeline_element` ยท `reorder_timeline` | Retime / resequence the timeline |
| `render_movie` | Assemble the timeline into the final listing video |
| `list_endpoints` ยท `api_request` | Discover the API catalog / call any route โ the escape hatch |
### Paid vs free
Writes and generation over the MCP require a **paid plan** โ free accounts are
**read-only** (browse projects, clips, and movies). `whoami` reports this up front;
a blocked write returns `403 MCP_PAID_PLAN_REQUIRED`. See plans at
[tryreelestate.com](https://tryreelestate.com).
## How auth works
```
first tool call
โ StreamableHTTP client โโโบ backend /mcp (401, needs auth)
โผ
opens your browser โโโบ Clerk OAuth (authorization code + PKCE, public client)
โ โ
โผ โผ
loopback http://localhost:8765/callback?code=โฆ access + refresh tokens
โ โ
โโโโโโโโโโโโโโบ finishAuth(code) โโโบ tokens cached โโโ (~/.reel-estate-mcp)
every later call: callTool("api_request", โฆ) over the authed /mcp connection
```
- **No secrets to distribute** โ public client + PKCE, browser login per user.
- **Prod-capable** โ uses the same OAuth the backend serves at `/mcp`.
- **The backend is the single auth authority** โ this bridge never mints tokens.
## Troubleshooting
| Problem | Fix |
| --- | --- |
| No login prompt / "not authenticated" | Run any tool (or `login`), open the printed URL, and approve. |
| Switch accounts / re-authorize | Run `logout`, or delete `~/.reel-estate-mcp`. |
| Writes blocked (`403 MCP_PAID_PLAN_REQUIRED`) | Creating/generating/rendering needs a paid plan; free accounts are read-only. See [tryreelestate.com](https://tryreelestate.com). |
## Architecture
- **`src/config.ts`** โ validated env (loaded from this package's folder); derives
the `/mcp` URL, OAuth store dir, callback port, read-only flag, and default client id.
- **`src/oauth.ts`** โ `OAuthClientProvider`: uses the public `client_id`, caches
tokens + the PKCE verifier, opens the system browser.
- **`src/upstream.ts`** โ the single OAuth'd MCP client connection to `/mcp` (with
the loopback callback server); `callTool` / `callApiRequest` proxies.
- **`src/api-client.ts`** โ `ApiClient` over `callApiRequest`; enforces read-only.
- **`src/catalog.ts`** โ the endpoint catalog surfaced by `list_endpoints`.
- **`src/tools.ts`** โ tools as plain functions (smoke-testable).
- **`src/index.ts`** โ registers the tools as MCP tools over **stdio**.
### Adding a tool
1. Add `async function fooBar(api, args)` in `src/tools.ts` (use `api.get(...)` /
`api.request(...)`, which proxy through `/mcp`).
2. Register it in `src/index.ts` with a Zod `inputSchema`.
3. Add it to `scripts/smoke.ts` if it's a GET.
Everything is already reachable through `api_request`; convenience tools just make
the common paths first-class.
## About Reel Estate
[**Reel Estate**](https://tryreelestate.com) helps real-estate agents and marketers
turn ordinary **listing photos into professional property videos** โ AI virtual
staging, twilight conversion, motion/drone clips, voiceover narration, and one-click
rendering for Instagram, TikTok, and YouTube. This MCP server brings that workflow
into your AI assistant. **[Get started at tryreelestate.com โ](https://tryreelestate.com)**
---
*Keywords: real estate video generator, AI listing video, virtual staging, MCP
server, Model Context Protocol, Claude, Cursor, property video marketing, drone
real estate video, twilight photo editing.*
TDQS
Scored across 23 tools
Tools are mostly distinct with clear purposes. Minor overlap between timeline-related tools (add_timeline_audio, add_timeline_overlay, move_timeline_element, reorder_timeline) is mitigated by detailed descriptions. Generic api_request could overlap but is explicitly for non-standard routes.
Naming conventions are mixed: most tools use verb_noun (e.g., add_image, list_projects), but some use noun-like patterns (project_stats, whoami, help). All use underscores, but the pattern is not uniform.
23 tools is slightly on the high side but still reasonable for the comprehensive pipeline (auth, project management, image editing, timeline, rendering, billing). Each tool serves a distinct function, so the count is justified.
Several obvious gaps exist: there is no create_project, delete_project, or update_project tool. Timeline manipulation lacks a remove_timeline_element tool. The surface relies on api_request for missing operations, but that is not ideal for a coherent tool set.