MCP · Tool
update
Modify an existing contact, company, deal, action, note, call, or meeting by id.
Last updated Jul 17, 2026
update modifies an existing record. Only the fields you send are
changed; everything else is left alone.
Signature
{
"type": "object",
"properties": {
"entity": { "type": "string", "description": "Entity type." },
"id": { "type": "string", "description": "The record id — a 24-character hex string." },
"data": { "type": "object", "description": "Fields to change." }
},
"required": ["entity", "id", "data"]
}
All three fields are required.
Supported entities
contact, company, deal, action, note, call, meeting.
Companies are updatable through update even though they’re not
directly creatable through create.
Finding the id
Use query to look the record up first. For
example:
{
"query": {
"from": "contacts",
"select": ["id", "first_name", "last_name"],
"where": { "emails.address": "jane.doe@acmesolar.example" }
}
}
Then pass the id straight into update.
Example
{
"entity": "contact",
"id": "65f1b3c2a4d8e9f0c1234567",
"data": {
"status_id": "prospect",
"tags": ["lead", "demo-requested", "qualified"]
}
}
Response:
{
"entity": "contact",
"id": "65f1b3c2a4d8e9f0c1234567",
"data": { /* the contact, after the update */ }
}
Array fields are full replacements
Fields that contain arrays — emails, phones, urls, tags — are
replaced wholesale, not merged. tags is a list of strings;
emails, phones, and urls are lists of objects ({ type, address },
{ type, number }, { type, url }). To add one entry rather than
overwrite the list, query the current value first and send the combined
array:
{
"entity": "contact",
"id": "65f1...",
"data": { "tags": ["lead", "demo-requested", "qualified"] }
}
Custom fields
Send a custom_fields object inside data, keyed by field name as
returned by describe. Only the custom fields
you include are changed:
{
"entity": "deal",
"id": "65f1b3c2a4d8e9f0c1234567",
"data": { "custom_fields": { "Tier": "Platinum" } }
}
Errors
- Not found / not accessible — both cases return the same generic “not found” response. The MCP server doesn’t distinguish “this id doesn’t exist” from “this id exists but is on a record you can’t see” by design, to avoid leaking the existence of records outside the user’s access scope.
- Validation errors — same surface as
create: each rejected field is named with the reason. - Unknown entity — response lists the valid entity names and hints at the singular form if a plural was sent.
Scope
crm — the write scope. crm.readonly is not sufficient.
Access checks run on every call. A contact, deal, or linked record must be accessible to the authenticated user (private records they don’t own, or records belonging to other users on a permission-scoped account, will be invisible).