Connect Cursor (MCP)¶
Cursor talks to RealtyPad over HTTP MCP on the same public host as the web app (/mcp). In production the MCP process is isolated from the REST API; the URL you configure does not change.
Prerequisites¶
- Cursor installed
- RealtyPad account (web login works)
- API reachable from your machine (local:
http://localhost:8000, production: your operator’s HTTPS URL) PUBLIC_BASE_URLset to the public API origin (MCP discovery / token endpoints)WEB_BASE_URLset to the web UI origin (consent page; local defaulthttp://localhost:5173)
Step 1 — Add the MCP server (browser OAuth)¶
Preferred: Cursor discovers OAuth, opens your browser, you sign in and approve the agent. No pasted Bearer token.
- Open Cursor Settings → MCP (or edit MCP config).
- Add a server with the MCP URL only:
Local example (API on port 8000):
{
"mcpServers": {
"RealtyPad": {
"url": "http://localhost:8000/mcp"
}
}
}
Production example:
{
"mcpServers": {
"RealtyPad": {
"url": "https://api.yourdomain.com/mcp"
}
}
}
- Save and reload MCP. Cursor should prompt to authorize → browser opens the web app at
/oauth/consent→ sign in (if needed) → Authorize. - Ask the agent to call
list_deals(limit 3). You should see deals from your tenant only.
If you see “Protected resource … does not match expected”¶
Clear the server’s stored OAuth state in Cursor (remove/re-add the MCP server, or clear auth), then reconnect. The MCP URL should be without a trailing slash:
http://localhost:8000/mcp
If you see “Authorization session ended” / Cursor never gets the URL¶
Cursor’s cloud callback (cursor.com/.../oauth/callback) often fails against a localhost MCP URL. Prefer mcp-remote (local :8787 callback) or fully quit Cursor (Cmd+Q) and reconnect:
{
"mcpServers": {
"RealtyPad": {
"command": "npx",
"args": ["-y", "mcp-remote@latest", "http://localhost:8000/mcp", "8787"]
}
}
}
If the browser never opens¶
Known Cursor issue: discovery succeeds but openExternal never runs. Try in order:
- In Settings → MCP, click Needs authentication (not only Connect).
- Open Output → MCP: RealtyPad, find
Redirect to authorization/ authorize URL, paste it into a browser. - Or use the
mcp-remotestdio proxy above.
Fallback — static agent JWT¶
If you need a long-lived token without the browser flow:
- Sign in to the web app.
- Open Agent → Mint agent JWT.
- Configure MCP with a Bearer header:
{
"mcpServers": {
"RealtyPad": {
"url": "http://localhost:8000/mcp",
"headers": {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIs..."
}
}
}
}
ChatGPT¶
Same MCP URL: https://app.realtypad.ai/mcp (no trailing slash). ChatGPT needs a public HTTPS endpoint (localhost will not work).
- In ChatGPT, open Settings → Apps and turn on Developer mode.
- Create a connector, paste the MCP URL, and choose OAuth.
- Sign in and authorize. Then ask ChatGPT to list a few deals and to call
get_agent_manual.
ChatGPT does not see Cursor project skills. Use get_agent_manual the same way as Claude.
Claude (claude.ai / Claude Desktop)¶
Same MCP URL: https://app.realtypad.ai/mcp (no trailing slash). Claude uses browser OAuth + Dynamic Client Registration.
Claude does not see Cursor project skills. At session start, call MCP tool get_agent_manual (omit workflow for the full manual, or pass ingest / research / investors / …). That is the reliable path — Claude often cannot read MCP resources or prompts.
For investor share chat and buyer financing profiles, use get_agent_manual(workflow=investors) plus tools such as list_investor_message_threads, list_deal_buyer_messages, and add_deal_buyer_message.
Optional prompts (realtypad_agent_manual, realtypad_skill_*) and resources (guide://realtypad/…) still exist for clients that support them; they return the same Markdown as the tool. Guides ship under api/app/mcp_guides/skills/.
If you see “Couldn’t register with RealtyPad’s sign-in service” (reference like ofid_…), the edge proxy must route /.well-known/* to the API (not the SPA). That is configured in deploy/Caddyfile. After a Caddy reload, these should return JSON (not HTML):
https://app.realtypad.ai/.well-known/oauth-protected-resource/mcphttps://app.realtypad.ai/.well-known/oauth-authorization-server/mcp
Troubleshooting¶
| Symptom | What to check |
|---|---|
401 / no authorize prompt |
PUBLIC_BASE_URL must match the URL Cursor uses; MCP_OAUTH_ENABLED must be true |
| Consent opens on API HTML / wrong host | Set WEB_BASE_URL to the web UI (e.g. http://localhost:5173) and restart API |
Claude: couldn’t register / ofid_… |
GET /.well-known/oauth-protected-resource/mcp must be API JSON; fix Caddy /.well-known/* → API |
| Empty deals | Token/consent bound to a different workspace |
| Connection refused | Wrong host/port; production requires HTTPS |
Docker MCP vs remote HTTP¶
Some setups use a Docker MCP bridge (user-HouseMaxxMCP) on the operator’s machine. For a shared hosted API, prefer the remote HTTP URL above so OAuth scopes to your tenant on the server. Local bridges must send a Bearer agent JWT (or use remote URL + browser OAuth).
Revoking access¶
Deny on the consent screen, rotate passwords, or mint a new agent JWT and drop the old one from Cursor config. OAuth refresh tokens are server-side and expire (~90 days).