# What 'Agent-Native CRM' Actually Means

> Source: <https://relaticle.com/blog/what-agent-native-crm-actually-means>
> Published: 2026-09-01 09:00:00+00:00

# What 'Agent-Native CRM' Actually Means

Agent-native CRM is not a product category defined by marketing. It is a set of verifiable architectural properties: an AI agent can do everything a human can do in the UI, writes are governed by a safety model built for agents rather than borrowed from human permissions, self-hosted and cloud deployments carry identical agent capability, the product's own surfaces speak machine-readable formats to agents, and the agent tooling ships as a first-party part of the product's own release, not a bolted-on integration. Every one of those five properties has a concrete test you can run against any CRM in about five minutes. "Has an MCP server" is not on the list, because it is table stakes now. [Twenty documents a first-party MCP server](https://docs.twenty.com/developers/extend/capabilities/mcp), including self-hosted configuration, checked September 22, 2026. Having one tells you nothing about whether it can set a custom field, whether it asks before it deletes 50 records, or whether any of it works if you self-host.

This post lays out the checklist, explains how to run each test yourself, and scores Relaticle against it, including the places it falls short today.

## 

The test: create a custom field in your CRM that exists nowhere else, one your engineering team didn't anticipate, then ask the agent to set it. If the agent says "I can't do that" or silently ignores the field, the write surface is a subset of the UI, and every custom field your team adds becomes something your agent quietly can't touch.

In Relaticle, custom fields are not hardcoded into the agent tooling. `CustomFieldsSchemaDescriber` (`packages/Chat/src/Services/Tools/CustomFieldsSchemaDescriber.php`) builds a per-tenant description of every active custom field for chat, including type, shared format hints, and option labels for choice fields, and inlines it into the tool schema the model sees. On the MCP side, `BaseCreateTool` and `BaseUpdateTool` (`app/Mcp/Tools/`) accept a `custom_fields` object validated by the same `App\Rules\ValidCustomFields` rule used by chat. Add a field in the Custom Fields admin UI and both surfaces expose it immediately, no code change required.

File handling now has a different boundary. The retired FileUpload custom-field type cannot be written. MCP can upload supported files through `upload-file`, using a public HTTPS URL, Base64 content, or a completed signed upload. It returns Markdown for rich-editor fields. The upload limit is 10 MB, with 60 calls per workspace per hour. JSON tools therefore do support file workflows without carrying raw binary bodies in every tool call.

## 

The test: use disposable records in a test workspace. Request a batch deletion and inspect whether the client asks for approval before execution. A safety model built for humans (a delete button with a confirm dialog) doesn't map cleanly onto an agent that can issue the same request a thousand times a minute. An agent-native CRM needs two distinct answers: one for a conversational agent acting on a user's behalf in real time, and one for a scoped integration acting autonomously.

Relaticle answers this with two different mechanisms for two different trust levels. Chat writes never touch the database directly. Every create, update, or delete proposed in conversation becomes a `PendingAction` row (`packages/Chat/src/Models/PendingAction.php`) with a `pending` status, an expiry, and the diff the user is being asked to approve; nothing executes until a human clicks approve. MCP is the other half ([how to connect a client](https://relaticle.com/blog/how-to-connect-claude-to-your-crm-with-mcp)): a scoped integration authenticated with an OAuth token or personal access token acts directly, no approval step, because the trust boundary was already crossed at token-issuance time, not at write time. Every MCP tool that performs a destructive action declares an explicit destructive hint in its MCP tool annotations (`app/Mcp/Tools/Company/DeleteCompanyTool.php` and its four siblings for people, opportunities, tasks, and notes) so any MCP client, human or agent, can see which calls may change or remove data before it makes them. Token abilities are checked per-call in `ChecksTokenAbility`, and OAuth clients get exactly one scope, `mcp:use`, deliberately coarse because the finer-grained boundary is which team's data the token is bound to, not which verbs it can call.

This is the property where "has an MCP server" tells you the least. A server can expose write tools with no approval step and no destructive annotations at all, and you'd only find out by testing it, not by reading a feature list. Run this test against any CRM's MCP server: ask it to delete something, and see whether the tool call itself declares that it's destructive before you approve the client to use it.

## 

The test: point the same agent workflow at a self-hosted instance with no internet-routed cloud dependency, and see what breaks. If chat degrades to a stub, or MCP just isn't there, the agent capability was cloud infrastructure wearing a CRM's branding.

Relaticle's chat and MCP routes are gated by `EnsureHostedWorkspaceAccess`, which delegates to `HostedWorkspaceAccess::allows()` (`app/Services/Billing/HostedWorkspaceAccess.php`). That gate checks a `Billing` feature flag first, and returns `true` unconditionally when it's off, which is the self-hosted default. There's no separate "self-hosted tier" of the agent tooling; it's the same billing gate the rest of the product uses, off by default outside the hosted product. `config/ai.php` configures Ollama (`OLLAMA_BASE_URL`, defaults to `localhost:11434`) and a generic `selfhosted` OpenAI-compatible provider alongside the hosted providers, so the model backing chat can run entirely on infrastructure you control. Chat and MCP ship in the same application. Self-hosted chat still needs a configured, compatible model provider.

Our own facts entry for Twenty used to read "marketed for Cloud workspaces," phrasing lifted straight from the vendor's pricing page. [Twenty's MCP documentation](https://docs.twenty.com/developers/extend/capabilities/mcp) includes self-hosted configuration, so we corrected the entry. That is exactly the kind of claim the checklist exists to force you to verify rather than take on faith, ours included.

## 

The test: request a documentation page with `Accept: text/markdown` instead of `text/html`, and see what comes back. If you get the same HTML with the same navigation chrome and marketing script tags an agent has to parse around, the surface wasn't built with agents as a first-class consumer.

Relaticle's `/developers` and `/help` routes run through `Spatie\MarkdownResponse\Middleware\ProvideMarkdownResponse` (`packages/Documentation/routes/web.php`). This is real content negotiation, not a static markdown mirror: the middleware inspects the `Accept` header, converts the HTML response to markdown on a cache miss, and returns it with `Content-Type: text/markdown`, a `Vary: Accept` header, and an estimated token count. An `/llms.txt` route lists the available documentation for agent discovery. It does not establish a search-ranking benefit.

## 

The test: check whether the MCP server or agent tools live in the product's own repository and ship with its own releases, or whether they're a separate package, a community wrapper, or something that can silently drift out of sync with the core product's version.

Relaticle's MCP server registers 39 tools, checked September 22, 2026. They live in `app/Mcp/`, the same directory tree as the CRM's Filament resources and Eloquent models, registered on a single `RelaticleServer` class versioned at `2.0.0`. The chat package (` packages/Chat/`) has no `composer.json` of its own; it's autoloaded straight from the root `composer.json` under the `Relaticle\Chat` namespace, which means it has no independent version number to fall out of sync, no separate release cadence, and no possibility of a chat feature announcement that describes a version of the tools nobody has installed yet. Whatever commit ships the CRM ships the agent tooling.

## 

Tracing the current write path reveals a board-ordering gap and a separate boundary around retired field types.

The first is board ordering. Moving an opportunity to a different pipeline stage works from chat or MCP, because stage is itself a custom field and flows through the same bridge as every other custom field. But reordering a card within a stage, the `order_column` value the Kanban board uses for its decimal-position drag-and-drop, is not in `UpdateOpportunityTool`'s schema and not in the `UpdateOpportunity` action's allowed attribute list. An agent can tell you a deal moved to "Negotiation." It cannot currently put it above or below a specific other deal in that column. That's UI-only today.

The retired FileUpload type remains unavailable for writes. Supported attachments use upload tools and rich-editor fields. This is a field-type boundary, not a general inability to upload files.

| Property | How to test it | Relaticle | 
|---|---|---|
| Full write surface | Add a custom field, ask the agent to set it | Active fields are discovered dynamically. Retired FileUpload fields are read-only; supported attachments use upload tools and rich-editor fields. | 
| Safety model for agents | Request a deletion of disposable test records and inspect approval behavior | Chat proposes, a human approves ( `PendingAction` ); MCP writes directly under a scoped token, destructive tools carry an explicit annotation | 
| Deployment parity | Run the same workflow against a self-hosted instance with no cloud dependency | The same chat and MCP code ships self-hosted. Chat requires a configured compatible provider; Ollama is a supported configuration. | 
| Agent-legible surfaces | Request docs with `Accept: text/markdown` | Real content negotiation returns markdown with token-count headers; `/llms.txt` served at the root | 
| First-party, versioned with the product | Check whether the tooling ships in the product's own repo and release | The MCP tools and chat package live in the CRM's own repository with no separate version to drift | 

Board ordering remains a UI-only operation. File workflows require the supported upload and rich-editor path. Evaluate those specific operations against your workflow.

## 

None of the five properties above require trusting a vendor's word. Each one is a specific action you can take in under ten minutes: create an unusual custom field and ask the agent to set it, ask an agent to delete something and see what happens before undo, point the workflow at a self-hosted deployment, request a docs page with a markdown `Accept` header, and check whether the agent tooling lives in the product's own repository or a side project.

Run those five tests against Relaticle at [relaticle.com/developers/mcp](https://relaticle.com/developers/mcp), and against whatever else you're evaluating, including Twenty. The full breakdown of pricing, self-hosting, and AI capability differences between the two is at [relaticle.com/compare/relaticle-vs-twenty](https://relaticle.com/compare/relaticle-vs-twenty). "Agent-native" should be a claim you can fail. If a vendor's checklist only ever produces green checkmarks, you're reading marketing copy, not an architecture.

[#mcp](https://relaticle.com/blog/tag/mcp)

## Related posts

        [Guides](https://relaticle.com/blog/the-real-cost-of-self-hosting-a-crm)
    

## The Real Cost of Self-Hosting a CRM

Self-hosting a CRM can be cheap, but it is not free. Here is the infrastructure, time, and SaaS comparison math.

        [Guides](https://relaticle.com/blog/migrating-from-hubspot-or-attio-to-a-self-hosted-crm)
    

## Migrating from HubSpot or Attio to a Self-Hosted CRM

Plan a HubSpot or Attio migration: export records and notes, map relationships, test imports, and identify the history and files needing separate work.

        [Guides](https://relaticle.com/blog/let-claude-code-run-your-sales-pipeline)
    

## Let Claude Code Run Your Sales Pipeline

Five real Claude Code sessions against Relaticle's MCP server: pipeline review, data entry, task cleanup, custom fields, and a delete it wouldn't rush.
