One person, every channel
Emails, phones and handles resolve to one record. Duplicate people merge automatically, so every agent sees the same Jane.
Built for agents · supervised by humans
Your agents talk to thousands of people. UndoCRM is where they remember who everyone is, what was said, and what's owed. It's built for agents as the users, with humans supervising.
The problem
1 callContext in one call. A ~200-token brief on the person, ranked by what the agent is about to do.
1 callLogging in one call. The conversation, what was learned and what's owed. Duplicate people merge automatically.
claimTeamwork between agents. Agents claim a person before contacting them, and opt-outs are honored by every agent.
5 toolsNative to agents. Five MCP tools in HubSpot's vocabulary, which agents already know. Connect with one command.
What UndoCRM gives your agents
Emails, phones and handles resolve to one record. Duplicate people merge automatically, so every agent sees the same Jane.
Every conversation, fact and follow-up for every person. Each value keeps its history, with the agent that wrote it and when.
Agents claim a person before contacting them. Two asking at once: exactly one wins.
One agent hears "stop"; every agent knows. Only a human can lift it.
A ~200-token brief, ranked by what the agent is about to do.
A clean dashboard for timelines, deals and an audit log of every agent action — with undo if something goes wrong. Undo never deletes data.
MCP-first. Five tools in HubSpot's vocabulary, which models already know.
How it works
Rules, deals, tasks, facts and history — ranked by purpose, cut to a token budget. About 200 tokens.
read("jane@acme.com")Blocked if they opted out or another agent is on it. Otherwise they're claimed for you.
can_contact(person, "email")With your own tools — email, phone, SMS, LinkedIn. UndoCRM never sends anything and never calls a model.
your agentOne call records the conversation, what was learned and what's owed. New people are created; duplicates merge.
create(type: "interaction")Every one of those writes shows up in the timeline and the audit log, attributed to the agent that made it. If something went wrong, undo it.
Activity → UndoWhy it beats existing CRMs
Speed is the product
Benchmarked with 1M contacts, 3M interactions and 2M facts in one workspace. Results and limits: docs/performance.
Humans in control
Every agent action lands in an audit log with the agent that made it. If one went wrong, undo it — try it here, and watch the record put itself back.
⌘Z works here too — and anywhere on this page.
Connect in one command
Works with Claude Code and any MCP client over Streamable HTTP. Results are short text written for a model, with the ids the next call needs. Errors say what to do instead.
create({ type: "interaction", person: "jane@acme.com", properties: { channel: "email", direction: "inbound", summary: "Budget approved at $80k; needs SOC2 first." }, facts: { budget: "$80k/yr", blocker: "SOC2 report" }, tasks: [{ due: "2d", subject: "Send the SOC2 report" }] })
Logged ix_e543dde288ec2cfd with Jane Doe (ct_8c77757b98080b2f).
Facts: budget (was: $50k/yr), blocker.
Tasks: fu_9d0e1f2a3b4c5d6e due 2026-10-20 "Send the SOC2 report".
# The same write over REST curl -X POST https://undocrm.com/v1/interactions \ -H "Authorization: Bearer $AGENT_KEY" \ -d '{"person": "jane@acme.com", "channel": "email", "direction": "inbound", "summary": "Budget approved…", "facts": [{"key": "budget", "value": "$80k/yr"}]}'
For agent builders
Built for developers whose agents talk to people: AI SDRs, recruiters, receptionists, support agents. Each of your customers gets an isolated workspace — its own agents, keys and data — from one call in your backend, so you can run agents for many clients.
Pricing
Questions
/mcp with an agent API key, or over the REST API at /v1. In Claude Code it's one command: claude mcp add --transport http undocrm https://undocrm.com/mcp --header "Authorization: Bearer ucrm_agt_…". The server sends the agent its usage instructions when it connects.can_contact. If nobody else is handling the person, it returns ALLOWED and claims them for that agent (24 hours by default). Any other agent asking gets BLOCKED, with who holds the claim and why. The check and the claim happen in one database transaction, so two agents asking at the same instant can't both be allowed.can_contact returns BLOCKED with the person's reason. Agents can add restrictions but cannot remove them; only a human can lift a do-not-contact rule.POST /v1/workspaces). Your team signs in with owner, admin or member roles.Create a workspace, connect an agent with one command, and watch it work.