What each option actually is
Each of the four is described below on its own terms, in the way its own advocates would describe it. A comparison that beats up a strawman is worth nothing to somebody actually choosing, and every one of these four is the correct answer to some real question.
An MCP server
An MCP server is a remote catalogue of tools that an AI assistant can discover and call during a conversation. The Model Context Protocol standardises three things: how a client connects and negotiates, how it lists what is available, and how it invokes something with structured arguments and reads a structured result. CRM Solid speaks revision 2025-06-18 of that protocol over Streamable HTTP, which means a POST carries a JSON-RPC 2.0 request, a GET opens a server-sent event stream, and a DELETE ends a session. Authentication is an ordinary bearer header carrying an API key you mint in the panel.
What the assistant gets on connecting is a catalogue: 62 tools such as crm_search_contacts, crm_list_social_conversations, crm_list_deals and crm_schedule_social_post, 21 resources that pre-load context like the connected accounts and the open deal list, and 15 prompts that package a recurring job such as a daily briefing or a pipeline review. The assistant reads the descriptions, works out which tools answer the question in front of it, calls them, reads the results, and decides what to do next. Nobody wrote that sequence down in advance. That is the whole proposition, and it is also the whole risk.
Sessions are optional. An initialize call returns an Mcp-Session-Id header that later calls may send back, and a DELETE tears the session down, but stateless calls without the header work too. There is also a discovery document at /.well-known/oauth-protected-resource per RFC 9728, which advertises that this resource is protected by a bearer API key. Responses are camelCase.
# List the catalogue. No arguments, so it is the safest first call.
curl -sS https://api.crmsolid.com/mcp \
-H "Authorization: Bearer csk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'A REST API with bearer keys
The REST API is a versioned HTTP surface that your own code calls in an order you decided when you wrote it. CRM Solid publishes it under /v1, with resource families that map onto the product: /v1/contacts, /v1/conversations, /v1/deals, /v1/tasks, /v1/pipelines, /v1/sequences, /v1/social, /v1/social/posts, /v1/email, /v1/finance, /v1/analytics, /v1/jobs, /v1/telegram/messages, /v1/twitter/messages, /v1/ai-agents, /v1/webhooks, /v1/api-keys and /v1/me. Authentication uses the same bearer key format as MCP, and each endpoint declares the scope it needs, so contacts:read gates the contact list on both surfaces.
Three details matter more than the endpoint list when you are choosing. First, reads are built for extraction: GET /v1/contacts takes an after cursor and a limit, and combining order=asc for the first full walk with updatedSince on every run after it gives you a resumable incremental sync. Second, writes accept an Idempotency-Key header: the first call runs and its response is stored, a retry inside the replay window returns that stored response with Idempotency-Replayed: true instead of running again, and reusing a key with a different body is refused as the client bug it is. Third, an X-Workspace-Id header selects which shared workspace the key is acting inside, and membership is verified server side, so the header cannot widen access.
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refusal is HTTP 429 with Retry-After. Read those headers and you never need to see a 429 at all.
# Incremental sync: walk oldest-first, then only what changed since last run.
curl -sS "https://api.crmsolid.com/v1/contacts?order=asc&limit=100&updatedSince=2026-08-25T00:00:00Z" \
-H "Authorization: Bearer csk_live_YOUR_KEY" \
-H "X-Workspace-Id: 12" -D -Outbound webhooks
An outbound webhook is the CRM calling you, not you calling the CRM. You register an HTTPS endpoint, subscribe it to the event types you care about or to everything with a wildcard, and CRM Solid POSTs a signed JSON envelope to that URL whenever a matching event fires. There are 23 event types today, covering contacts (contact.created, contact.updated, contact.deleted, pipeline.stage_changed), messaging (message.sent, message.received, sequence.completed), the outreach engine (outreach.step.sent, outreach.replied, outreach.completed, outreach.unsubscribed), deals (deal.created, deal.updated, deal.stage_changed, deal.won, deal.lost), work (task.created, task.completed), finance (invoice.created, invoice.paid, finance.transaction.created), plus subscription.changed and a webhook.test you can fire on demand.
The envelope is { event, id, deliveredAt, data } and everything inside data is camelCase. Five headers travel with it: an HMAC-SHA256 signature as X-Webhook-Signature: sha256=<hex>, plus X-Webhook-Event, X-Webhook-Event-Id, X-Webhook-Attempt and X-Webhook-Timestamp. The signing secret is shown once when you create the endpoint and never again. Verify the signature with a constant-time comparison over the raw body before you parse a field.
Delivery is retried on transient failure with a widening schedule: one minute, five minutes, fifteen minutes, one hour, six hours, then daily, up to eight attempts by default, with a thirty second request timeout per attempt. Every attempt is recorded with its status, response code and error, which is the observability story you get for free and the reason a webhook problem is usually easier to diagnose than a polling problem.
No-code automation platforms
A no-code automation platform is a hosted runtime where somebody builds a trigger-and-action rule in a browser and the platform runs it. Zapier, Make and n8n are the familiar examples of the category. You pick a trigger, optionally add filters and transformations, and pick actions in other products. The platform handles scheduling, credentials, retries and a run history, and the person who built it needs no repository, no deployment and no on-call rotation.
Any platform of this kind can drive CRM Solid, because the REST API and the webhook dispatcher are ordinary HTTP. A generic webhook trigger receives our signed event, and a generic HTTP action calls a /v1 endpoint with a bearer key you paste into the platform's credential store. That is worth saying plainly: the no-code option is not a separate integration surface, it is a different owner and a different billing model for the same two surfaces.
The honest limits of the category are structural rather than about any one vendor. Pricing is generally per task or per operation run, so cost scales with volume in a way engineering time does not. The credential you paste in lives in somebody else's system. Version control, code review and staging are weaker than a repository. And a rule that grows past a handful of steps tends to become harder to reason about in a visual builder than the equivalent thirty lines of code would have been. None of that is a reason to avoid the category. It is a reason to know when a rule has outgrown it.
Dimension by dimension
Ten dimensions decide almost every one of these choices. The matrix below is the summary, and the prose after it explains what each row means in practice and which way it should push you.