curl -X POST "https://yoursite.com/api/mcp" \
-H "authtoken: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "jsonrpc": "...", "method": "..." }'
initialize:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": { "listChanged": false },
"resources": { "subscribe": false, "listChanged": false },
"prompts": { "listChanged": false }
},
"serverInfo": { "name": "rise-crm-rest-api", "version": "2.1.0" }
},
"id": 1
}
tools/list:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"tools": [
{
"name": "clients_list",
"description": "List RISE CRM clients, newest first, soft-deleted rows excluded. Clients are the converted customer companies that projects, invoices, estimates, tickets and contracts are attached to. Page with limit and offset; narrow the created_date range with created_after and created_before; match exact column values with filters.",
"inputSchema": {
"type": "object",
"properties": {
"limit": { "type": "integer", "description": "Max rows, default 25.", "minimum": 1, "maximum": 100 },
"offset": { "type": "integer", "description": "Rows to skip.", "minimum": 0 },
"created_after": { "type": "string", "description": "Lower bound on created_date. YYYY-MM-DD or YYYY-MM-DD HH:MM:SS." },
"created_before": { "type": "string", "description": "Upper bound on created_date, same format." },
"filters": { "type": "object", "description": "Exact-match filters, e.g. {\"client_id\":12}. Useful: owner_id, created_by, type, country. Unknown columns ignored.", "additionalProperties": true }
}
}
},
{
"name": "clients_search",
"description": "Find RISE CRM clients by keyword, matched as a substring of company_name, address, city, state, zip, country, phone, vat_number. Use it to turn a name or title into a record id.",
"inputSchema": {
"type": "object",
"properties": {
"q": { "type": "string", "description": "Keyword. Case-insensitive substring match." },
"limit": { "type": "integer", "description": "Max rows, default 25.", "minimum": 1, "maximum": 100 }
},
"required": ["q"]
}
}
]
},
"id": 2
}
tools/list paged (opt in with a cursor):
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"tools": [],
"nextCursor": "dG9vbHM6NTA"
},
"id": 2
}
resources/list:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"resources": [
{ "uri": "rise://server/info", "name": "RISE server info", "mimeType": "application/json" },
{ "uri": "rise://catalogue/resources", "name": "RISE record catalogue", "mimeType": "application/json" },
{ "uri": "rise://catalogue/lookups", "name": "RISE lookup values", "mimeType": "application/json" }
]
},
"id": 6
}
resources/read of rise://invoices/48:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"contents": [
{
"uri": "rise://invoices/48",
"mimeType": "application/json",
"text": "{\"resource\":\"invoices\",\"id\":48,\"record\":{...},\"items\":[...],\"payments\":[...]}"
}
]
},
"id": 7
}
prompts/list:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"prompts": [
{
"name": "summarise_client",
"description": "Summarise a client: who they are, their contacts, active work, invoicing position and what to do next.",
"arguments": [
{ "name": "client_id", "description": "Numeric client id. Use clients_search to find it from a company name.", "required": true }
]
}
]
},
"id": 8
}
prompts/get summarise_client:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"description": "Summarise a client: who they are, their contacts, active work, invoicing position and what to do next.",
"messages": [
{ "role": "user", "content": { "type": "text", "text": "Summarise RISE CRM client 12 for an account review. ..." } },
{ "role": "user", "content": { "type": "resource", "resource": { "uri": "rise://clients/12", "mimeType": "application/json", "text": "{...}" } } }
]
},
"id": 9
}
tools/call:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"content": [
{
"type": "text",
"text": "{\n \"count\": 1,\n \"records\": [\n {\n \"id\": \"12\",\n \"company_name\": \"Acme Corporation\",\n \"city\": \"San Francisco\",\n \"created_date\": \"2026-02-14 09:21:45\"\n }\n ]\n}"
}
],
"isError": false
},
"id": 1
}
Notification only payload:
HTTP/1.1 202 Accepted
MCP server disabled:
HTTP/1.1 403 Forbidden
{
"jsonrpc": "2.0",
"error": { "code": -32000, "message": "MCP server is disabled." },
"id": null
}
Parse error:
HTTP/1.1 400 Bad Request
{
"jsonrpc": "2.0",
"error": { "code": -32700, "message": "Parse error: the request body must be a JSON-RPC 2.0 object or array." },
"id": null
}
Unknown method:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"error": { "code": -32601, "message": "Method not found: tools/get" },
"id": 3
}
Tool failure (isError result, not a protocol error):
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"result": {
"content": [{ "type": "text", "text": "Error: Client 999 was not found." }],
"isError": true
},
"id": 4
}
Resource that cannot be read:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"error": { "code": -32002, "message": "Invoice 999 was not found." },
"id": 7
}
Missing prompt argument:
HTTP/1.1 200 OK
{
"jsonrpc": "2.0",
"error": { "code": -32602, "message": "The \"summarise_client\" prompt requires the \"client_id\" argument." },
"id": 9
}