Let your AI client read and safely enrich HubSpot or Pipedrive records through the MCP server, with previews and undo.
Goal: connect your CRM and have your AI client enrich contacts and companies without overwriting data you care about.
crm_* tools are hidden from your
MCP client, and CRM calls fail with CRM integration is not enabled. Activate it in account settings first.active in your profile.ACTION FOR THE HUMAN: open https://app.anysite.io/profile (Open profile).
You can also connect from the chat: the crm_connect tool returns a link to open in the browser, and
crm_connect_status reports when the connection is active. Only one CRM can be connected at a time —
connecting a second one fails with Another CRM is already connected. Disconnect it before connecting a new one.
Disconnect the current one in your profile to switch.
crm_upsert_contacts and crm_upsert_companies apply the same rules to every field of every record:
overwrite_properties.overwrite_properties. Built-in protected fields:
HubSpot hubspot_owner_id, lifecyclestage, hs_lead_status; Pipedrive owner_id, label, label_ids,
visible_to. Your own protected fields from the profile are added to these.allow_create: true.dry_run: true returns, for every record, the fields that would be written with their
old and new values, and writes nothing. Your client should show you this preview before a bulk write.Every skipped field or record comes back as a warning with a reason, so nothing is dropped silently.
| Object | Matched by | Creating a new record requires |
|---|---|---|
| Contacts | email, record_id or linkedin_url |
email |
| Companies | domain or record_id |
domain |
linkedin_url matching always works in HubSpot. In Pipedrive it works only if the account has a custom
person field for LinkedIn that Pipedrive search can reach; otherwise such records never match.duplicate_contacts /
duplicate_companies warning reports how many candidates there were.associate_company_domain or associate_company_id. An existing
company link is kept unless overwrite_associations: true.| Reason | Meaning |
|---|---|
fill_blank_skip |
The field already had a value and was not in overwrite_properties. |
protected_field |
The field is protected. |
read_only_property |
The CRM does not allow writing this property. |
empty_value |
The value to write was empty. |
enum_option_missing |
The value is not one of the property's options. |
not_found + create_not_allowed |
No record matched and allow_create was off. |
record_not_found |
The given record_id does not exist. |
create_requires_email |
A new contact could not be created without an email. |
duplicate_contacts / duplicate_companies |
Several records matched; the oldest was updated. |
scan_incomplete |
The CRM was too large to search completely, so an existing company may have been missed. |
crm_get_schema returns contact and company properties (including custom ones and dropdown options), lists
and the protected fields; ask for specific properties to keep the answer short. crm_query_records reads
records by list, record ids, contact emails or free-text search, with the properties you name and a cursor
for the next page.
Every real write returns a run_id. crm_undo(run_id) restores the previous value of every field that run
wrote and removes the company links it added:
conflicts and left as it is.record_missing.undo_run_id can be undone the same way.Ask your client to run a small enrichment as a dry run, for example
Enrich my 5 newest HubSpot contacts with their current job title — dry run first. You should see a preview
with old and new values and no change in the CRM. Run it for real, then crm_undo with the returned run_id
to see the values restored.
| Message | Fix |
|---|---|
No crm_* tools in the client |
Turn on CRM Integration in your profile, then refresh the client's tool list. |
No active CRM connection. Run crm_connect first. |
Connect a CRM in your profile or with crm_connect. |
Multiple active CRM connections, pass connection_id explicitly. |
Ask the client to use crm_list_connections and pass the connection_id. |
CRM connection was revoked. Reconnect your CRM. / CRM connection is not active |
Access was removed on the CRM side. Disconnect and connect again in your profile. |
Run not found |
The run_id is wrong or belongs to another connection. |