MCP Server
Connect AI assistants to CalyxCRM using the Model Context Protocol
Overview
CalyxCRM includes a built-in Model Context Protocol (MCP) server that allows AI assistants like Claude Desktop, Cursor, and other MCP-compatible clients to interact with your CRM data directly. The MCP server exposes the same capabilities as the REST API as structured tools that AI assistants can discover and call.
With MCP, your AI assistant can:
- List and inspect your data objects and their attributes
- Query, create, update, and delete records
- Log activities linked to records
- Run reports and retrieve results
- Trigger workflow automations
- View organization members
Authentication
The MCP server uses the same API keys as the REST API. Each MCP tool enforces the scopes assigned to the key, so an API key with only records:read will only expose read-only record tools.
See API Keys for instructions on creating and managing keys.
Server URL
The MCP server endpoint is:
https://your-domain.com/api/mcp/mcpThe server uses the Streamable HTTP transport (the modern replacement for SSE-based MCP).
Connecting AI Clients
Claude Desktop
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"calyx-crm": {
"url": "https://your-domain.com/api/mcp/mcp",
"headers": {
"Authorization": "Bearer caly_your_api_key_here"
}
}
}
}Cursor
Add this to your Cursor MCP settings (.cursor/mcp.json):
{
"mcpServers": {
"calyx-crm": {
"url": "https://your-domain.com/api/mcp/mcp",
"headers": {
"Authorization": "Bearer caly_your_api_key_here"
}
}
}
}Claude Code
Add this to your project's .mcp.json:
{
"mcpServers": {
"calyx-crm": {
"type": "url",
"url": "https://your-domain.com/api/mcp/mcp",
"headers": {
"Authorization": "Bearer caly_your_api_key_here"
}
}
}
}Other MCP Clients
Any MCP-compatible client that supports Streamable HTTP transport can connect by pointing to the server URL and passing the API key as a Bearer token in the Authorization header.
Available Tools
The MCP server registers the following tools, grouped by resource. Each tool requires the corresponding API key scope.
Objects
| Tool | Scope | Description |
|---|---|---|
list_objects | objects:read | List all active objects in the organization |
get_object | objects:read | Get an object by ID with its attributes |
create_object | objects:write | Create a new custom object |
update_object | objects:write | Update a custom object |
delete_object | objects:write | Delete a custom object |
Records
| Tool | Scope | Description |
|---|---|---|
list_records | records:read | List records with pagination and sorting |
get_record | records:read | Get a single record by ID |
create_record | records:write | Create a new record |
update_record | records:write | Update a record (merges with existing data) |
delete_record | records:write | Delete a record |
bulk_records | records:write | Bulk create or upsert up to 100 records |
bulk_delete_records | records:write | Bulk delete up to 100 records by ID |
search_records | records:read | Search records with complex filters |
Attributes
| Tool | Scope | Description |
|---|---|---|
list_attributes | attributes:read | List attributes for an object |
get_attribute | attributes:read | Get a single attribute |
create_attribute | attributes:write | Create a new attribute on an object |
update_attribute | attributes:write | Update an attribute's name |
delete_attribute | attributes:write | Delete an attribute and clean up record data |
Activities
| Tool | Scope | Description |
|---|---|---|
list_activities | activities:read | List activities with optional filtering |
get_activity | activities:read | Get a single activity |
create_activity | activities:write | Create an activity linked to records |
update_activity | activities:write | Update an activity |
delete_activity | activities:write | Delete an activity |
Reports
| Tool | Scope | Description |
|---|---|---|
list_reports | reports:read | List all reports |
get_report | reports:read | Get a report with its configuration |
run_report | reports:run | Execute a report and store results |
list_report_runs | reports:read | List past runs for a report |
get_report_run | reports:read | Get a run with full results |
Workflows
| Tool | Scope | Description |
|---|---|---|
list_workflows | workflows:read | List all workflows |
get_workflow | workflows:read | Get a workflow with full details |
run_workflow | workflows:run | Trigger a workflow execution |
list_workflow_runs | workflows:read | List execution history for a workflow |
Members
| Tool | Scope | Description |
|---|---|---|
list_members | members:read | List organization members with roles |
Files
| Tool | Scope | Description |
|---|---|---|
get_upload_url | files:write | Generate a signed URL for file uploads |
Webhooks
| Tool | Scope | Description |
|---|---|---|
get_webhook_info | webhooks:manage | Get webhook portal URL and event types |
Tool Input and Output
All tool inputs are structured JSON parameters. The AI client handles serialization automatically. Tool outputs are JSON strings containing the same response shapes as the REST API.
Example: listing objects
The AI assistant calls list_objects with no parameters. The tool returns:
{
"objects": [
{
"id": "uuid",
"type": "standard",
"pluralName": "People",
"singularName": "Person",
"slug": "people",
"isActive": true,
"createdAt": "2024-01-01T00:00:00Z"
}
]
}Example: searching records
The assistant calls search_records with:
{
"objectId": "uuid",
"filters": [
{ "attributeSlug": "status", "operator": "equals", "value": "active" },
{ "attributeSlug": "email", "operator": "contains", "value": "@example.com" }
],
"sort": { "field": "created_at", "order": "desc" },
"limit": 25
}Error Handling
If a tool encounters an error (missing scope, not found, validation failure), it returns an error object with isError: true:
{
"error": "Object not found"
}{
"error": "Insufficient scope: this API key does not have the required scope \"records:write\""
}MCP vs REST API
| Feature | REST API | MCP Server |
|---|---|---|
| Transport | HTTP requests to /api/v1/ | Streamable HTTP via MCP protocol |
| Auth | Authorization: Bearer header | Same API keys via MCP auth layer |
| Input | URL params, query strings, JSON body | Structured tool parameters |
| Output | JSON HTTP responses | JSON tool results |
| Scopes | Enforced per endpoint | Enforced per tool |
| Rate limiting | 100 req/min per key | Shared with REST API |
| Best for | Custom integrations, scripts, CI/CD | AI assistants (Claude, Cursor, etc.) |
Both interfaces expose the same data and enforce the same security model. Use the REST API for programmatic integrations and the MCP server for AI assistant access.
Dashboard Configuration
You can find the MCP server URL and ready-to-copy client configuration snippets in:
- Navigate to Organization Settings in the sidebar
- Click Developers
- Select the MCP tab
Next Steps
- API Keys - Create and manage API keys for MCP authentication
- API Reference - Detailed documentation for all available operations
- Webhooks - Subscribe to real-time CRM events