In the previous article, we created a FavCRM workspace and received a fav_mcp_* API key.
Now we can connect an agent.
FavCRM exposes its backend through the Model Context Protocol at:
https://api.favcrm.io/mcp
Once authenticated, the client can discover 165 typed tools across CRM, bookings, loyalty, invoices, commerce, content, team onboarding, WhatsApp setup, and reporting.
Add FavCRM to Cursor
Create or update ~/.cursor/mcp.json.
{
"mcpServers": {
"favcrm": {
"url": "https://api.favcrm.io/mcp",
"headers": {
"Authorization": "Bearer ${env:FAVCRM_API_KEY}"
}
}
}
}
Then set the environment variable somewhere Cursor can read it.
export FAVCRM_API_KEY=fav_mcp_...
Restart Cursor and check the MCP settings panel. The favcrm server should connect and expose the tool catalog.
The important detail is that the key lives in an environment variable, not in a repo-tracked config file.
Add FavCRM to Claude Desktop
Until OAuth connector installs are generally available, advanced users can use the same bearer-token shape in a Claude Desktop MCP config.
The server URL is the same:
https://api.favcrm.io/mcp
The header is the same:
Authorization: Bearer fav_mcp_...
The exact config file location depends on your Claude Desktop environment, but the MCP server shape is identical: a Streamable HTTP server URL plus the bearer token header.
Smoke-test from the CLI
The CLI is also an MCP client, so it is useful for smoke tests.
favcrm doctor
favcrm tool list
To inspect one tool:
favcrm tool describe create_booking
To call a read-only tool:
favcrm tool call list_services '{}'
If the workspace is new, an empty list is not an error. It means the tool call succeeded and there are no services yet.
What the catalog gives the agent
An MCP tool is more than a function name.
Each FavCRM tool includes:
- a name
- a description
- an input schema
- an output shape
- annotations for agent safety
Those annotations are what let an agent reason about operational risk.
For example:
-
list_servicesis read-only -
create_bookingwrites data -
cancel_bookingchanges booking state - customer-facing sends and external services are open-world operations
Agents should inspect unfamiliar tools before calling them:
favcrm tool describe create_booking
favcrm tool describe cancel_booking
favcrm tool describe request_send_approval
This is the difference between an agent operating a backend and an agent guessing against a database.
Use plan checks before gated operations
Some operations depend on plan, module, quota, or billing state.
Before a write that might be gated, call:
favcrm plan status
favcrm plan check --tool create_account
favcrm plan check --module whatsapp
favcrm plan options
If the operation requires an upgrade, the backend can return an upgrade action. A Stripe-hosted link is only created when the user explicitly confirms:
favcrm plan upgrade --plan-code favcrm-lite --confirm
This keeps the agent from accidentally triggering payment flows while still making the next step clear.
Use approval-gated sends
Customer-facing messages should not be treated like normal CRUD.
For campaigns, WhatsApp, SMS, email, and inbox replies, prefer approval-gated workflows. The agent drafts the message, shows the user the intended recipient or segment, and requests approval before sending.
That pattern gives the agent power without letting it silently message customers.
A useful first prompt
After connecting FavCRM to Cursor or Claude, try:
Use the FavCRM tools to inspect this workspace.
First list my companies, then show plan status, then list services.
Do not create or send anything yet.
A good agent should call safe read-only tools first:
list_my_companiesget_plan_statuslist_services
Then it should summarize what is configured and what is missing.
What comes next
Now that the agent can discover and call tools, we can build a useful app.
In the next article, we will create a booking storefront backed by real CRM data: services, available slots, bookings, confirmation, and customer records.
Top comments (0)