Affinity
Relationship intelligence CRM for warm-introduction paths and deal-network mapping
What agents can do in Affinity
affinity_create_recordCreate a new Affinity CRM record: a person, company, or opportunity. Required attributes by type: persons need firstName/lastName and/or emails[]; companies need name (and ideally domain); opportunities need name plus a listId (the opportunity-type list to create it on). Optional: listId adds a new person/company to a list; fieldValues[] sets initial global field values (persons/companies only — dropdown and owner values may be given as text/email and are resolved to their IDs). Duplicate guard: before creating, the tool searches for an existing match (person by email, company by domain/name, opportunity by name). On a hit it returns that record with duplicateSuspected:true and creates NOTHING — pass allowDuplicate:true to force. The create spans several Affinity APIs and is NOT atomic: the result reports each step (created, addedToList, fieldValuesSet[], fieldValuesFailed[]). If any step failed, tell the user exactly which one — never report partial success as full success.
affinity_get_recordGet full details of one Affinity CRM record: core attributes, global field values, list memberships with their per-list entry data, and recent notes. Notes are capped at the 20 most recent. Opportunities are a special case: they cannot have global field values in Affinity, so an opportunity returns its list-entry field data only. That is expected, not an empty record. Use include[] to narrow what is fetched (fields, lists, notes) when you only need part of the record.
affinity_list_fieldsDiscover Affinity fields: their exact IDs, data types (each field's valueType, needed for search filters), whether they are writable, and dropdown options where available. Call this before using fieldIds in a search, get_record, or field write, so you use real field IDs instead of guessing. Scopes: global_persons, global_companies, or list (with listId for a specific list's fields). Returns up to 50 matching fields plus a total count; narrow with "search" (case-insensitive substring on the field name) when the total exceeds what is returned. Fields with readOnly:true cannot be written — that covers enrichment-sourced fields and Affinity-computed ones (enriched / relationship-intelligence types). Dropdown options may be absent for global-scope fields (Affinity does not include them in global listings). You can still write such a field with an option ID or its exact text; values that cannot be checked locally are validated by Affinity itself.
affinity_listsBrowse this Affinity workspace's lists (pipelines), their entries, and the customer's own saved views. Actions: - list_all: every list with its id, name, entity type, and size. - get_list: one list's metadata (requires listId). - get_entries: a list's rows, each the entity plus its list-scoped field values (requires listId; pass fieldIds[] to hydrate specific fields). - get_saved_views: the saved, filtered views defined on a list (requires listId). - get_view_entries: the rows of one saved view (requires listId and savedViewId). Entry actions return up to 100 rows per page (default 20); pass the returned "cursor" back for the next page.
affinity_manage_listsManage Affinity lists (pipelines) and their membership. Actions: - create_list: create a new list (requires name and type — one of person, company, opportunity; isPublic optional). - add_to_list: add a person/company/opportunity to a list, creating a list entry (requires listId and entityId). - remove_from_list: take a row off a list (requires listId and listEntryId). This removes ONLY the list entry — the underlying person, company, or opportunity is never deleted.
affinity_notes_remindersCreate, update, and delete Affinity notes, and create or list reminders. Actions: - create_note: add a note (requires content and at least one association across personIds, companyIds, or opportunityIds; at most 100 of each). Note HTML is restricted to <p><strong><em><a><ul><ol><li> — anything else is stripped before sending. - update_note: replace a note's content (requires noteId and content). - delete_note: delete a note (requires noteId). This is the only delete this integration performs, and it only ever deletes a note. - create_reminder: create a reminder (requires reminder: { content, dueDate, recurrence?, and one of personId/companyId/opportunityId }). - list_reminders: list reminders (paged; pass the returned "cursor" back for the next page).
affinity_relationshipsAffinity relationship intelligence: who on your team knows a person or company, how strong that relationship is, and the interaction history behind it. Provide exactly one of personId or companyId. Actions: - interactions: the interaction timeline (emails, meetings, calls, chats) with the entity. Filter with interactionTypes[]; defaults to all. - strengths: relationship-strength scores between your internal team and the external person (for a company, its primary contacts, capped at 10). - intro_paths: those strengths ranked highest-first, naming the internal team member best placed to make an introduction ("who on our team knows X best"). Read-only: relationship data is computed by Affinity and cannot be written back.
affinity_searchSearch Affinity CRM for persons, companies, or opportunities. Object types: persons, companies, opportunities. Search terms need at least 3 characters. Persons and companies are matched server-side by name, email, or domain; opportunities are matched by name against the most recent page. Persons and companies also take field filters and sorts — call affinity_list_fields first to get each field's ID and valueType, both required in a filter condition. Returns up to 100 results per page (default 20); pass the returned "cursor" back to get the next page.
affinity_update_recordUpdate an existing Affinity CRM record. attributes: core-attribute changes (persons: firstName/lastName/emails[]; companies: name/domain). fieldValues[]: global field-value writes (persons/companies). Opportunities have no global fields — write their data via listEntryFieldValues. listEntryFieldValues[]: list-scoped writes, each { listId, listEntryId?, fieldId, value }; for a person/company, when listEntryId is omitted the record's single entry on that list is resolved automatically (and the write fails fast if the record appears on that list more than once). For an opportunity, listEntryId is REQUIRED — get it from affinity_lists get_entries on the opportunity's list. Dropdown/ranked-dropdown and owner values may be given as text/email and are resolved to their IDs; each substitution is reported under "normalized". Read-only enrichment fields and global (shared-dataset) companies are rejected before any change is made. Per-step disclosure: the result reports which writes succeeded and which failed — surface any failures to the user.
Put Affinity on autopilot
Deploy AI agents that take these actions for you, with human-in-the-loop controls and a complete audit trail.