MCP Server
Connect any MCP client (Claude, Cursor, ChatGPT) to your Fondaro CRM and property data over the hosted Model Context Protocol server.
Fondaro runs a hosted Model Context Protocol (MCP) server, so any MCP-capable AI client can read and act on your CRM and property data as you. Point a client at one URL, sign in, and the assistant can list leads, log notes, move deals, and search property sources on your behalf.
The connection always acts as the signed-in user in their active organization: members reach only the leads assigned to them, and organization admins reach the whole organization. Nothing about MCP widens what an account can already do in the dashboard.
Server Endpoint
There is one endpoint. Paste it into your client exactly as written, path included and with no trailing slash:
https://api.fondaro.com/mcp/v1
The server speaks Streamable HTTP. It is stateless and returns JSON. Only POST carries MCP traffic; there is no separate SSE stream to configure.
Authentication
The server accepts two kinds of credentials. Most desktop and web clients use OAuth automatically. Headless scripts and clients that take a raw header use an API key.
OAuth 2.1 (recommended)
Clients that support MCP OAuth need no manual setup beyond the URL. On first connect the client discovers the authorization server, sends you to the Fondaro sign-in and consent screen, and receives a scoped access token.
-
Discovery follows RFC 9728. The server publishes protected-resource metadata at:
https://api.fondaro.com/.well-known/oauth-protected-resource/mcp/v1 -
Authorization server: Fondaro's identity provider (Clerk). Dynamic client registration is enabled, and a consent screen is always shown before access is granted.
-
OAuth scopes:
openid profile email user:org:read. Theuser:org:readscope is what binds the token to your active organization. A token with no organization is rejected. -
OAuth connections receive the full tool-scope set (see Tool scopes).
API keys
An API key is a self-managed alternative for clients that connect with a static header. Keys use the prefix fdr_mcp_ followed by a random string:
fdr_mcp_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
Send it as a Bearer token:
curl -X POST https://api.fondaro.com/mcp/v1 \
-H "Authorization: Bearer fdr_mcp_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Key facts:
- Keys are minted per user from the dashboard (Settings, then Integrations, then Fondaro MCP). See the Fondaro MCP dashboard guide.
- The plaintext key is shown exactly once at creation and is stored only as a SHA-256 hash. If you lose it, revoke it and mint a new one.
- Each key carries a chosen subset of tool scopes, enforced fail-closed: a tool whose scope the key lacks is hidden from
tools/listand denied at call time. - Keys can have an optional expiry (1 to 3650 days) and can be revoked at any time. Members revoke their own keys; organization admins can revoke any key in the organization.
Tool scopes
Every tool declares the scope it needs. Three scopes exist:
| Scope | Grants |
|---|---|
crm:read | Read leads, tasks, notes, deals, calls, and email history |
crm:write | Create and modify leads, tasks, notes, and deals |
properties:read | Search property sources and read listings |
OAuth tokens carry all three. API keys carry whatever subset you choose when minting them (omit the subset to grant all three). A key missing a tool's scope never sees that tool.
Identity and scoping
Every tool call runs as the caller, with the same access the dashboard enforces:
- Members see and touch only leads assigned to them. Lists, searches, counts, and timelines all narrow to their own leads. Reaching a lead they are not assigned to returns an access error, never another member's data.
- Organization admins operate organization-wide.
- Admin-only tools (lead assignment and organization-wide bulk status changes) are hidden from a member's
tools/listentirely. - Write tools additionally require the organization's active subscription entitlement. In an un-entitled organization the write tools are hidden and blocked; read tools stay available.
Access is bound to live organization membership, re-checked on every request behind a short role cache (about five minutes). Removing a user from the organization therefore severs both their OAuth connections and their fdr_mcp_ keys within that window, even though OAuth tokens do not otherwise expire on their own. Individual API keys can also be revoked at any time from the dashboard.
Rate limits
- Per user or key: 120 requests per 60 seconds. Exceeding it returns a structured rate-limit error with a
Retry-Afterheader. - Portal property searches: external property portals share a daily allowance of 300 calls per organization per UTC day. Once reached, portal-backed calls return an informative error until midnight UTC; the internal MLS and connected sources (Resales Online, Zoddak, Inmobalia) stay available.
Calling tools
MCP traffic is JSON-RPC over the endpoint itself. List the available tools:
curl -X POST https://api.fondaro.com/mcp/v1 \
-H "Authorization: Bearer fdr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Call a tool by name with its arguments:
curl -X POST https://api.fondaro.com/mcp/v1 \
-H "Authorization: Bearer fdr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_leads",
"arguments": { "limit": 10 }
}
}'In practice you will rarely craft these by hand. Your MCP client renders the tools and calls them for you once connected.
Connecting clients
| Client | How to connect |
|---|---|
| claude.ai / Claude Desktop | Settings, then Connectors, then Add custom connector. Paste the URL and sign in to Fondaro. |
| Claude Code | claude mcp add --transport http fondaro https://api.fondaro.com/mcp/v1, then run /mcp to authenticate. Add --header "Authorization: Bearer fdr_mcp_YOUR_KEY" to use a key instead. |
| Cursor | Settings, then MCP, then Add server (or add the JSON below to .cursor/mcp.json). OAuth runs on first use; add a headers block to use a key. |
| ChatGPT | Add as a connector. ChatGPT connectors authenticate with OAuth only; API keys are not supported. Read tools work; write support depends on your ChatGPT plan. |
Cursor .cursor/mcp.json:
{
"mcpServers": {
"fondaro": {
"url": "https://api.fondaro.com/mcp/v1"
}
}
}The friendly dashboard guide covers these steps in more detail.
Managing keys
MCP API keys are created and revoked from the dashboard, which calls the key-management REST endpoints below. These endpoints use your normal dashboard session (a Clerk JWT), not an fdr_mcp_ key.
| Method | Endpoint | Description |
|---|---|---|
POST | /mcp-keys | Mint a key for yourself. Body: { name, scopes?, expiresInDays? }. Returns { id, key, keyPrefix, scopes, expiresAt }. |
GET | /mcp-keys | List keys. A member sees their own; an admin sees every key in the organization. Never includes the key value. |
DELETE | /mcp-keys/:id | Revoke a key. Members revoke their own; admins revoke any key in the organization. |
Request body for POST /mcp-keys:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | A label to identify the key |
scopes | string[] | No | Any of crm:read, crm:write, properties:read. Omit for all three. |
expiresInDays | number | No | 1 to 3650. Omit for a non-expiring key. |
The key field is returned only in the POST response and never again.
Tool catalogue
The server exposes 38 tools in eight groups. Reads carry crm:read or properties:read; writes carry crm:write and require the organization's subscription entitlement. The three admin-only tools are hidden from a member's tool list.
Leads
| Tool | Description | Scope | Admin only |
|---|---|---|---|
list_leads | List CRM leads with optional filters, paginated | crm:read | No |
search_leads | Fuzzy-search leads by name, email, or phone | crm:read | No |
get_lead | Full detail for one lead | crm:read | No |
get_lead_timeline | A lead's chronological activity timeline | crm:read | No |
get_lead_counts | Lead counts for each pipeline stage | crm:read | No |
list_tags | The organization's CRM tag catalogue | crm:read | No |
list_org_members | The organization's members, for assignment | crm:read | No |
create_lead | Create a new CRM lead | crm:write | No |
update_lead_contact | Update a lead's name, email, or phone | crm:write | No |
update_lead_status | Move a lead to a different pipeline stage | crm:write | No |
set_lead_tags | Replace the full tag list on a lead | crm:write | No |
Lead assignment
| Tool | Description | Scope | Admin only |
|---|---|---|---|
set_lead_assignees | Replace the owners on a lead | crm:write | Yes |
add_lead_assignees | Add owners to a lead without removing existing ones | crm:write | Yes |
bulk_update_lead_status | Move many leads to one stage, organization-wide | crm:write | Yes |
Tasks
| Tool | Description | Scope | Admin only |
|---|---|---|---|
list_tasks | List your tasks, or a single lead's tasks | crm:read | No |
create_task | Create a task on a lead | crm:write | No |
update_task | Update a task (reassigning is admin-only) | crm:write | No |
delete_task | Permanently delete a task | crm:write | No |
Notes
| Tool | Description | Scope | Admin only |
|---|---|---|---|
list_notes | List the notes on a lead | crm:read | No |
create_note | Add a note to a lead | crm:write | No |
update_note | Edit a note's content | crm:write | No |
delete_note | Delete a note (author, or any admin) | crm:write | No |
Deals
| Tool | Description | Scope | Admin only |
|---|---|---|---|
list_deals | List deals for a lead or across the organization | crm:read | No |
get_deal | Fetch one deal by id | crm:read | No |
create_deal | Create a deal on a lead | crm:write | No |
update_deal | Update a deal's fields | crm:write | No |
change_deal_stage | Move a deal to another pipeline stage | crm:write | No |
close_deal_won | Mark a deal as won | crm:write | No |
close_deal_lost | Mark a deal as lost | crm:write | No |
reopen_deal | Reopen a won or lost deal | crm:write | No |
Calls (read-only)
| Tool | Description | Scope | Admin only |
|---|---|---|---|
get_call_history | A lead's call history with recording, transcript, and analysis flags | crm:read | No |
get_call_transcript | The stored transcript for a call | crm:read | No |
get_call_analysis | The stored AI analysis for a call | crm:read | No |
Email (read-only)
| Tool | Description | Scope | Admin only |
|---|---|---|---|
get_email_history | A lead's email history | crm:read | No |
Properties (read-only)
| Tool | Description | Scope | Admin only |
|---|---|---|---|
list_property_sources | List every property source the organization can search, and what each supports | properties:read | No |
search_properties | Search one property source for listings | properties:read | No |
get_property | Fetch the full details of one property | properties:read | No |
autocomplete_location | Resolve a place name to a source-native location token | properties:read | No |
The property tools span the internal Fondaro MLS, the per-organization connected sources (Resales Online, Zoddak, and Inmobalia, when the organization has each integration set up), and 19 public property portals. Call list_property_sources first: it reports which sources are connected and the exact source values the other property tools accept.
Security best practices
- Treat an
fdr_mcp_key like a password. Store it in a secrets manager, never in source control. - Grant each key only the scopes its client needs. A read-only assistant does not need
crm:write. - Use an expiry for time-limited integrations, and revoke keys you no longer use.
- Rotate a key by minting a new one, updating the client, then revoking the old one. Multiple live keys plus revoke make this zero-downtime.
- Prefer OAuth where the client supports it: the consent screen, per-connection revocation, and the organization binding are all handled for you.
Related Articles
Fondaro MCP (Dashboard)
Connect Claude, Cursor, ChatGPT, and other AI assistants to your Fondaro CRM and property data with the Fondaro MCP server: mint a key, connect a client, and work your pipeline in plain language.
Authentication
How to create, use, and revoke Fondaro API keys for programmatic access.
Integrations (Dashboard)
Connect Fondaro to external tools: Resales Online MLS search, Zoddak off-plan developments, Zapier and n8n automation, and Inmobalia contact import.