Personal CRM tools
Every tool in this module, with its full description, parameters, and return value. All of them require the module to be active first. See the Personal CRM overview for how to turn it on.
Core tools
Create, read, update, and delete entries. Every module has exactly these four.
personal_crm_add_entryAdd a person to the user's Personal CRM module. Requires the module to be active — see create_database. Before adding, check whether this person is already tracked: call personal_crm_search_contacts (or personal_crm_list_entries if the CRM is small) with the name. If a confident match already exists, use personal_crm_update_entry or personal_crm_log_touchpoint against that entryId instead of creating a second row for the same person — this tool does not deduplicate on your behalf.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| person | string | Yes | |
| relationship | string | No | |
| company | string | No | |
| birthday | string | No | ISO date, e.g. 1990-08-20. Use any year if the birth year is unknown. |
| last_interaction | string | No | ISO date, e.g. 2026-08-20 |
| follow_up_date | string | No | ISO date, e.g. 2026-08-20 |
| important_details | string | No | |
| category | family | friend | colleague | client | acquaintance | other | No | |
| tier | close | regular | distant | No | |
| follow_up_cadence_days | number | No | Check in with this contact every N days. |
Returns
The created entry as JSON, including its id.
personal_crm_list_entriesList entries in the user's active Personal CRM module.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| limit | number | No | Max entries to return (default 100, max 500). |
Returns
Every entry in the active database, as a JSON array.
personal_crm_update_entryUpdate fields on an existing Personal CRM entry.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes | |
| person | string | No | |
| relationship | string | No | |
| company | string | No | |
| birthday | string | No | |
| last_interaction | string | No | |
| follow_up_date | string | No | |
| important_details | string | No | |
| category | family | friend | colleague | client | acquaintance | other | No | |
| tier | close | regular | distant | No | |
| follow_up_cadence_days | number | No |
Returns
The updated or deleted entry as JSON. Returns an error if entryId does not belong to an entry in the active database.
personal_crm_delete_entryDelete an entry from the user's active Personal CRM module.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes |
Returns
The updated or deleted entry as JSON. Returns an error if entryId does not belong to an entry in the active database.
Purpose-built tools
Shortcuts and queries shaped around how Personal CRM is actually used, so your agent doesn't have to fetch every entry and filter them itself.
personal_crm_attach_photoAttach a photo to an existing Personal CRM entry (replacing any photo already on it). If you have the image's raw bytes, pass photo_base64. If the user attached the image in a chat client (e.g. claude.ai), you cannot read its bytes: call this WITHOUT photo_base64 to get a one-time upload link, and give that link to the user so they can upload the photo themselves. The link expires in 30 minutes. Photos are stored privately; the returned viewPath is only viewable signed into the connacto web app as this user.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes | ID of the Personal CRM entry to attach the photo to. |
| photo_base64 | string | No | The photo, base64-encoded (no data: URI prefix). Omit when you cannot read the image bytes — the tool then returns an upload link for the user instead. |
| photo_content_type | image/jpeg | image/png | image/webp | image/heic | No | MIME type of the photo, if photo_base64 is set. Defaults to image/jpeg. |
Returns
JSON with a private viewPath when photo_base64 was given, or an uploadUrl to hand the user when it was not.
personal_crm_add_entriesBulk-add people to the user's Personal CRM module in one call, e.g. importing a contact list. Requires the module to be active — see create_database. Accepts up to 200 contacts per call. This does not deduplicate against existing contacts, unlike personal_crm_add_entry: it's meant for importing a batch wholesale, not for logging one person at a time.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| contacts | object[] | Yes |
Returns
The created entries as JSON, plus a count.
personal_crm_search_contactsFuzzy-search contacts in the active Personal CRM by name (and company, as a secondary signal). Use this before personal_crm_add_entry to check whether a person is already tracked, to decide whether to add a new contact or update/log a touchpoint against an existing one.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| query | string | Yes | Free-text name to search for, e.g. 'mike' or 'mike chen'. |
| limit | number | No | Max candidates to return (default 5, max 20). |
Returns
Returns the result of this tool call as JSON.
personal_crm_list_due_for_follow_upList entries in the active Personal CRM whose follow_up_date is on or before a given date (defaults to today).
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| asOf | string | No | ISO date, e.g. 2026-08-20. Defaults to today if omitted. |
Returns
Matching entries as a JSON array.
personal_crm_log_touchpointConvenience tool to record that you just interacted with a contact: sets last_interaction in one call. If type is given, also records a row in the contact's interaction history. follow_up_date is set explicitly if passed; otherwise it's recomputed from the contact's follow-up cadence (if one is set) or left unchanged.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes | |
| last_interaction | string | Yes | ISO date, e.g. 2026-08-20 |
| follow_up_date | string | No | ISO date, e.g. 2026-08-20. If omitted, recomputed from the contact's follow-up cadence when one is set. |
| type | call | text | email | coffee | meeting | other | No | If given, also logs this as an interaction-history row. |
| notes | string | No | Notes for the interaction-history row. Only used when type is given. |
Returns
An object with the updated contact and the created interaction row (or null if type was not given).
personal_crm_list_upcoming_birthdaysList contacts in the active Personal CRM whose birthday falls within the next N days, ordered by how soon it comes up. Only the month and day are compared, so the birth year does not matter.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| withinDays | number | Yes | How many days ahead to look. Defaults to 30. |
| asOf | string | No | ISO date, e.g. 2026-08-20. Defaults to today if omitted. |
Returns
Matching entries as a JSON array, each with a daysUntilBirthday field.
personal_crm_set_follow_up_cadenceSet (or clear, by passing null) how often, in days, to check in with a contact. Setting a cadence immediately recomputes follow_up_date from the contact's current last_interaction (or today, if none is logged yet). Clearing it leaves the existing follow_up_date alone.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes | |
| cadence_days | object | Yes | Days between check-ins. Pass null to clear the cadence. |
Returns
The updated or deleted entry as JSON. Returns an error if entryId does not belong to an entry in the active database.
personal_crm_interaction_historyList logged interactions for a contact in the active Personal CRM, newest first.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| entryId | string | Yes | |
| limit | number | No | Max entries to return (default 100, max 500). |
Returns
Matching interaction rows as a JSON array.
personal_crm_list_by_categoryList entries in the active Personal CRM with a given category.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| category | family | friend | colleague | client | acquaintance | other | Yes |
Returns
Matching entries as a JSON array.
personal_crm_statsSummarize the active Personal CRM: contact counts by category and tier, plus how many contacts are past their follow_up_date.
Parameters
None. Call it with an empty object.
Returns
An object with totalContacts, byCategory, byTier, and pastFollowUpDate counts.
personal_crm_overdue_followupsList contacts in the active Personal CRM who are overdue for a follow-up, computed server-side: for contacts with a follow_up_cadence_days set, the cadence is recomputed from their last_interaction; for contacts without a cadence, their explicit follow_up_date is used. Ordered most overdue first.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| asOf | string | No | ISO date, e.g. 2026-08-20. Defaults to today if omitted. |
Returns
Overdue entries as a JSON array, each with nextDueDate and daysOverdue.
personal_crm_upcomingList what's coming up in the active Personal CRM within the next N days: birthdays and contacts whose computed follow-up due date falls in that window (contacts already overdue are excluded, see personal_crm_overdue_followups).
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| withinDays | number | Yes | How many days ahead to look. Defaults to 30. |
| asOf | string | No | ISO date, e.g. 2026-08-20. Defaults to today if omitted. |
Returns
An object with birthdays and followUps arrays, each entry annotated with daysUntil.
personal_crm_recent_interactionsList the most recently logged interactions across every contact in the active Personal CRM, newest first, each with the contact's name. For a single contact's full history, use personal_crm_interaction_history instead.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| limit | number | No | Max entries to return (default 100, max 500). |
Returns
Returns the result of this tool call as JSON.