Replies: 2 comments
|
This is not a crash/regression but a missing agent capability: MCP exposes no tool for record merge, even though mergeCompanies/mergePeople already exist as GraphQL mutations and the UI provides Merge. Severity MEDIUM because it blocks automated duplicate repair (core agent workflow) but is partially workaroundable via manual UI merge. Likely missing MCP tool wiring in backend MCP/tool registry layer (no code located within fetch budget). Report is clear on behavior and request; missing only: exact MCP server/tool catalog code location, and whether any existing internal merge tool endpoints exist but are not exposed. |
|
I encountered this when having multiple agents doing market research at the same time. The inability to allow the agents to identify and resolve duplicates by merging was a blocker. Given the necessity of the use case, I added a local skill with the following script that does it through the GraphQL interface. This unblocked me and the agents, but it seems like this should be a method exposed to the MCP server. |
Uh oh!
There was an error while loading. Please reload this page.
Summary
There is no merge tool anywhere in the MCP surface, so an agent that creates a duplicate cannot repair it. The capability already exists —
mergeCompaniesandmergePeopleare GraphQL mutations, and merge is available in the UI — it is simply not exposed as a tool.The bundled
crm-hygieneskill acknowledges the gap and routes around it:So the agent-facing story for the one operation that fixes duplicates is "ask a human to go and do it".
Why this matters more than a typical missing tool
Duplicate prevention is only partial, which makes repair load-bearing:
Harbour Point ITonharbourpoint.exampleandHarbour Point I.T. Ltdonharbourpoint.co.example, plus a third with the same name and no domain. All three persisted.duplicateCriteriaoncompanyis[["name"], ["domainNamePrimaryLinkUrl"]], so the product already considers a name collision a duplicate — it just does not act on it.An agent doing research at any volume will create these. Today the only defence is its own discipline in searching before every create, and the only remedy is a human in the UI. Worse, the duplicate-blocking that does work surfaces as a raw constraint name:
which does not say which record was collided with, so the agent still has to search to recover the existing id.
What already works
mergeCompaniesbehaves exactly as an agent would want, including a dry run. Verified against a real pair of duplicates:dryRun: truereturns the merged shape and writes nothing (both records still present afterwards).conflictPriorityIndexselects which record wins a conflict.That is a well-behaved, previewable, reversible operation — precisely the kind of thing that is safe to give an agent.
Request
Expose merge as an MCP tool, e.g.
merge_records/merge_companies/merge_people, withids,conflictPriorityIndexanddryRunpassed through.Two things that would make it materially more useful to an agent:
dryRunin the tool surface. It lets an agent show the user exactly what a merge would produce before asking for approval, which is whatcrm-hygienealready asks for ("Always confirm before writing. Show what you will change and wait.").companiesandpeople; there is nomergeEvidencesor equivalent for a custom object. Anyone modelling their own entities hits the same wall one level down.A smaller, independent improvement: have the unique-constraint violation name the conflicting record id, so an agent can recover from a failed create in one step instead of a follow-up search.
Environment
twentycrm/twenty:latest, image digestsha256:c6fcea05fc7302a4e620bc1556493abf9b919e62d808c155fedc19a798bf5578(created 2026-09-24), Postgres 16mergeAll reactions