Your CRM as a connector: Claude can look up a customer, summarise a pipeline, log a call, create a task or move a deal — in the workspace you approved, as you.
The short version. Codext CRM is an open-source, AI-first CRM that is also its own MCP server and its own OAuth provider. Connect it in Claude, sign in to your CRM, approve a workspace, and Claude gets 55 tools over that workspace — 37 that read, 18 that write — every call attributed to you in the CRM's audit log. It never sends anything to a customer, never issues or cancels an invoice, and never touches a workspace you did not approve.
crm.codext.de — workspaces there are created by invitation; write to
crm@codext.de — or on an instance you run yourself.
Self-hosting is one Docker command; see
github.com/codextde/codext-crm.crm.codext.de.
A self-hosted Codext CRM exposes exactly the same server at
https://your-crm.example.com/api/mcp. Add that URL under
Settings → Connectors → Add custom connector; the OAuth flow is identical, because the CRM
discovers and registers itself — there is no client id or secret to fill in. Your instance needs
to be reachable over HTTPS with APP_URL set to its public address, which the
installer does for you.
In Claude Code the same server is one line:
claude mcp add --transport http codext-crm https://your-crm.example.com/api/mcp
The CRM's own Settings → MCP server page shows your instance's URL, the same steps, and every assistant currently connected.
Tools are grouped by the part of the business they cover. Read tools carry the MCP
readOnlyHint and run without a prompt. Write tools that change an existing record
carry destructiveHint, so Claude asks before running them; the four that only ever
add a row (create_deal, create_task, create_project,
create_product) do not. Read tools are the only ones offered on a read-only
connection — they are not merely refused, they are not shown.
| Tool | What it does | Access |
|---|---|---|
get_workspace_overview | Pipelines, stages, team and currency — call this first; other tools need the ids it returns. | read |
search_contacts · get_contact | Find people by name, email, company or status; read one in full with timeline and open tasks. | read |
search_companies · get_company | Find accounts by name, domain or industry; read one with its people and deals. | read |
search_deals · get_deal | Find deals by stage, owner, value or close date; read one with its history. | read |
list_pipelines · get_pipeline_summary | Stage definitions, and counts and value per stage. | read |
find_stale_deals | Open deals nobody has touched in a while. | read |
list_tasks · list_activities · list_team_members | Open work, the timeline, and who is on the team. | read |
search_knowledge | The workspace's sales knowledge base — pricing, objections, playbooks. | read |
create_contact · create_company | Add a person or an account; both deduplicate, so they merge rather than double up. | write |
update_contact · update_company · update_deal | Change fields on an existing record. Only the fields passed are touched. | write · asks first |
create_deal | Open a new deal in a pipeline stage. | write |
move_deal_stage | Advance a deal. Moving into a won or lost stage closes it and notifies the team, so Claude confirms with you first. | write · asks first |
log_activity | Record a note, call or meeting on the timeline. | write · asks first |
create_task · complete_task | Add a follow-up, or tick one off. | write |
| Tool | What it does | Access |
|---|---|---|
search_offers · get_offer | Quotes and their line items. | read |
search_invoices · get_invoice | Invoices, what is paid and what is outstanding. | read |
get_revenue_summary · list_retainers | Revenue over a period; recurring retainers. | read |
list_products · list_deal_line_items | The catalogue, and what is on a deal. | read |
record_invoice_payment | Book money that has arrived. It does not send anything to the customer. | write · asks first |
create_product | Add a product or price to the catalogue. | write |
| Tool | What it does | Access |
|---|---|---|
search_projects · get_project | Projects, their health, milestones and updates. | read |
list_meetings · get_meeting | Upcoming and past meetings with attendees and notes. | read |
search_documents | Contracts and signed documents. | read |
create_project · add_project_milestone | Start a project after a won deal; add a phase to it. | write |
update_project · update_project_milestone | Change status, health, dates or owner; tick a phase off. | write · asks first |
log_meeting_outcome | Write up what was decided and close the meeting out. | write · asks first |
| Tool | What it does | Access |
|---|---|---|
search_emails · list_email_templates | Correspondence synced into the CRM, and the templates the team uses. | read |
list_campaigns · get_campaign | Outbound campaigns and their steps and results. | read |
list_forms · list_form_submissions | Web forms and the answers they collected. | read |
get_record_note · write_record_note | The long-form note on a record. Append is the default; replace only when asked. | read / write · asks first |
list_goals · list_custom_fields · list_ai_employees | Targets and attainment, custom fields, and the AI colleagues configured in the workspace. | read |
Two resources come along for orientation: crm://workspace/overview and
crm://guide, a short guide to which tool answers which question.
Where a task ends in one of those, Claude prepares the work — the draft, the line items, the summary — and hands back a link to finish it in the CRM.
The consent screen offers two scopes: Read your CRM (crm:read) and
Make changes in your CRM (crm:write). Grant only what you need; a
read-only connection is a perfectly good one for reporting. Each connection is bound to one user
in one workspace, and every call it makes is written to the workspace's audit log with the
connector's name, so an administrator can always tell which assistant did what.
Access tokens last eight hours and are refreshed automatically; refresh tokens rotate on every use, and a refresh token that is replayed revokes the whole connection. To disconnect, remove the connector in Claude, or open Settings → MCP server in the CRM and revoke it there — the CRM side wins, and takes effect immediately.
| Symptom | What it means |
|---|---|
| "Couldn't reach the MCP server" when connecting your own instance | The instance is not reachable over HTTPS from the internet, or APP_URL is not its public address. Check https://your-crm/.well-known/oauth-protected-resource loads and names the right host. |
Claude says a tool needs the crm:write scope | The connection was approved read-only. Disconnect and reconnect, allowing changes. |
| "Too many requests" | A connection may make 300 calls a minute. Claude backs off by itself; just try again. |
| A tool says a record is not in this workspace | The id belongs to another workspace, or the record was deleted. Search again. |
What the connector stores, where it goes and for how long is set out in the connector privacy policy. For help, write to crm@codext.de, or — for anything reproducible — open an issue at github.com/codextde/codext-crm/issues, where it lands with the people who wrote the code. Security reports go to the address in SECURITY.md.