Integration

Dex integration

Dex is a personal CRM. Search, filter, create, update, merge and delete contacts and their emails, phone numbers, addresses and related contacts; organize them with groups, tags, favorites and custom fields; log notes on the timeline; manage reminders; read and edit events on the connected calendar and search the connected mailboxes; act on attention items (draft or send a reply); and read or run Dex Research on a contact. Most tools are the canonical v2 API; the group, tag, view and reminder searches, find_contacts_by_email and get_unified_timeline are the vendor's v1 routes. Not exposed: Dex for Teams workspace features (this connection acts in your Personal Dex), and the company, company role, keep-in-touch cadence and workspace routes the vendor spec lists but the live API answers as unknown routes. Writes that change data take an Idempotency-Key header: send a new UUID for each change. Authentication is a Dex API key (dex_ followed by 64 characters, created in Settings, Dex API & MCP, Dex Professional plan) sent as a Bearer token; a key may be Read-only. Limit: 100 requests a minute (the vendor pages differ on whether it is counted per account or per key and endpoint); after a 429 rate_limited answer, wait before retrying.

Ask it in chat

Say what should happen.
The workflow builds itself.

When this happens, do that in Dex.Built from the 103 Dex tools below, on the connection you add once.

What you can do with Dex

Each of these is one operation on one endpoint, available both as a workflow step and as a tool an AI agent can call on its own. Nothing bundles several operations into one action, so what a run did stays readable afterwards.

Most endpoints run on the free plan. A few, mainly the ones that publish on your behalf, need a paid plan.

Contact, 15 operations

  • count_contactsCount contactsGETCounts all your contacts; returns data.count. For a filtered count, call filter_contacts and read data.pagination.count.
  • create_contactCreate contactPOSTCreates one contact (name, job, company, socials, emails, phones). For many at once use create_contacts_bulk. Needs a fresh Idempotency-Key UUID per change.
  • create_contacts_bulkCreate contacts bulkPOSTCreates up to 500 contacts in one call; returns the created contacts and a data.batch partial-success report. Needs a fresh Idempotency-Key UUID per change.
  • delete_contactDelete contactDELETEPermanently deletes a contact. Not available to a Read-only key.
  • delete_contacts_bulkDelete contacts bulkPOSTPermanently deletes several contacts in one call; returns affected and the deleted ids.
  • filter_contactsFilter contactsPOSTLists contacts matching a where filter sent as JSON (tags, groups, company, job title, location, interaction dates, custom fields, starred, archived), with paging. Read-only.
  • find_contacts_by_emailFind contacts by emailPOSTFinds the contacts matching one or more email addresses; returns the matching contacts in data. Leave createFromOAuthInteractions out for a pure lookup.
  • get_contactGet contactGETGets one contact by id. Emails and phone numbers are left out unless include[contact_emails] or include[contact_phone_numbers] is true.
  • list_contactsList contactsGETLists your contacts, cursor-paginated (take, cursor). For filters (tags, groups, company, dates, custom fields) use filter_contacts; for a name search use search_contacts_by_name.
  • list_group_contactsList group contactsGETLists the contacts in a group, cursor-paginated. Emails and phones are left out unless include[contact_emails] or include[contact_phone_numbers] is true.
  • merge_contactsMerge contactsPOSTMerges groups of duplicate contacts into one surviving record each (the oldest unless primary_contact_id is set). Irreversible; failed groups come back in data.failed. Needs a fresh Idempotency-Key UUID per change.
  • search_contactsSearch contactsPOSTSearches contacts by free text across seven fields with similarity ranking, or by phone digits, optionally near a place or within groups. An empty query lists by most recent interaction.
  • search_contacts_by_nameSearch contacts by nameGETSearches contacts by name (typeahead, accent-insensitive) and returns full contact rows. query is required; for other fields or an empty query use search_contacts.
  • update_contactUpdate contactPATCHUpdates a contact; only the fields sent change. add_emails/remove_emails and add_phones/remove_phones edit those lists. Needs a fresh Idempotency-Key UUID per change.
  • update_contacts_bulkUpdate contacts bulkPOSTUpdates up to 500 contacts in one call; some rows can succeed while others fail (data.failed). Not available inside a workspace. Needs a fresh Idempotency-Key UUID per change.

Group, 10 operations

  • count_groupsCount groupsGETCounts your groups, optionally filtered (nested, top-level, by name, archived); returns data.count.
  • create_groupCreate groupPOSTCreates one group, optionally nested under parent_id and with starting members. Needs a fresh Idempotency-Key UUID per change.
  • delete_groupDelete groupDELETEPermanently deletes a group; its contacts are kept, only their memberships go. A very large group answers 202 and finishes in the background within minutes.
  • delete_groups_bulkDelete groups bulkPOSTPermanently deletes several groups (contacts are kept); per-row failures come back in data.failed.
  • get_groupGet groupGETGets one group; include[parent_group], include[sub_groups] or include[is_favorite] add those relations.
  • get_group_contact_countsGet group contact countsGETReturns the number of contacts in each group as data.counts, a map of group id to count; groupIds limits it to some groups.
  • list_groupsList groupsGETLists your groups (named contact collections with emoji and description); filter nested or top-level groups, by name or archived state.
  • merge_groupsMerge groupsPOSTMerges source groups into this group: it keeps its id, takes finalName and finalEmoji and the union of members; the source groups are DELETED. Needs a fresh Idempotency-Key UUID per change.
  • search_groupsSearch groupsGETSearches your groups by name; returns data.items with nextCursor and count.
  • update_groupUpdate groupPATCHUpdates a group's name, emoji, description or parent_id; only the keys sent change. Needs a fresh Idempotency-Key UUID per change.

Favorite, 9 operations

  • count_favoritesCount favoritesGETCounts your favorites; returns data.count.
  • create_favoriteCreate favoritePOSTStars a group, saved view or contact (send exactly one of group_id, view_id, contact_id). Needs a fresh Idempotency-Key UUID per change.
  • create_favorites_bulkCreate favorites bulkPOSTStars up to 100 groups, views or contacts in one call; each entry carries exactly one of group_id, view_id or contact_id. Needs a fresh Idempotency-Key UUID per change.
  • delete_favoriteDelete favoriteDELETEUnstars a group, view or contact by deleting its favorite row.
  • delete_favorites_bulkDelete favorites bulkPOSTUnstars several favorites in one call (deletes the favorite rows, not the starred records).
  • get_favoriteGet favoriteGETGets one favorite; exactly one of group_id, view_id or contact_id is set and that record is inflated (groups, views or contacts).
  • list_favoritesList favoritesGETLists your favorites (starred groups, views and contacts) with the starred record inflated, cursor-paginated.
  • update_favoriteUpdate favoritePATCHChanges a favorite's ranking (its position); the starred target cannot change. Needs a fresh Idempotency-Key UUID per change.
  • update_favorites_bulkUpdate favorites bulkPOSTChanges the ranking of up to 100 favorites in one call; per-row failures come back in data.failed. Needs a fresh Idempotency-Key UUID per change.

Tag, 9 operations

  • count_tagsCount tagsGETCounts your tags; returns data.count.
  • create_tagCreate tagPOSTCreates a tag, or returns the existing one with the same name (tags are unique per name). Needs a fresh Idempotency-Key UUID per change.
  • create_tags_bulkCreate tags bulkPOSTCreates several tags from a list of names; existing names are returned instead of duplicated, skipped names come back in data.failed. Needs a fresh Idempotency-Key UUID per change.
  • delete_tagDelete tagDELETEPermanently deletes a tag and removes it from every contact.
  • delete_tags_bulkDelete tags bulkPOSTDeletes several tags by id, or EVERY tag you own with deleteAll=true. Irreversible. Needs a fresh Idempotency-Key UUID per change.
  • get_tagGet tagGETGets one tag by id; include[contacts_count] adds how many contacts carry it. 404 when it is not yours.
  • list_tagsList tagsGETLists your tags (flat labels on contacts), cursor-paginated; include[contacts_count] adds how many contacts carry each, orderBy sorts by name or count.
  • search_tagsSearch tagsGETSearches your tags by name; returns the matching tags in data, each with _count.tags_contacts.
  • update_tagUpdate tagPATCHRenames a tag; renaming to a name you already use answers 400. Needs a fresh Idempotency-Key UUID per change.

Note, 7 operations

  • create_noteCreate notePOSTLogs a note or meeting on the timeline, optionally linked to contacts. Needs a fresh Idempotency-Key UUID per change.
  • create_notes_bulkCreate notes bulkPOSTLogs up to 500 notes in one call. Needs a fresh Idempotency-Key UUID per change.
  • delete_noteDelete noteDELETEPermanently deletes a note.
  • get_noteGet noteGETGets one note by id; include[attachments] and include[timeline_items_contacts] add its files and linked contacts.
  • list_contact_notesList contact notesGETLists one contact's notes, newest first, cursor-paginated.
  • search_notesSearch notesGETFull-text search over your notes (body and linked contact names), filterable by contact, group, date window and meeting type; cursor-paginated.
  • update_noteUpdate notePATCHUpdates a note; only the keys sent change. Needs a fresh Idempotency-Key UUID per change.

Reminder, 7 operations

  • create_reminderCreate reminderPOSTCreates a reminder with a due date, optional text, time, recurrence and linked contacts. Needs a fresh Idempotency-Key UUID per change.
  • delete_reminderDelete reminderDELETEPermanently deletes a reminder.
  • get_reminderGet reminderGETGets one reminder by id; include[contacts] or include[reminders_contacts] adds the linked contacts.
  • list_recurring_remindersList recurring remindersGETLists your recurring (keep-in-touch) reminders, all at once with no pagination.
  • list_remindersList remindersGETLists your reminders, filterable by completion, overdue, text and due or creation date, cursor-paginated.
  • search_remindersSearch remindersGETSearches your reminders by title or content, optionally in a date window and by completion; returns data.items with nextCursor and count.
  • update_reminderUpdate reminderPATCHUpdates a reminder (text, due date, recurrence, completion, linked contacts); only the keys sent change. Set is_complete=true to complete it. Needs a fresh Idempotency-Key UUID per change.

Attention item, 5 operations

  • draft_attention_item_replyDraft attention item replyPOSTDrafts your reply to an attention item's thread in your saved writing style; nothing is sent or saved. Returns subject, body and to; send it with send_attention_item_reply.
  • get_attention_item_threadGet attention item threadGETReads the email thread behind an attention item live from your mailbox, oldest first, with each message's id (for send_attention_item_reply), sender, date, html and text. Premium or Professional plan.
  • list_attention_itemsList attention itemsGETLists email threads Dex flagged as waiting on you (a reply expected, or an action like signing), newest first; open items only unless includeResolved=true. Personal Dex only.
  • resolve_attention_itemResolve attention itemPATCHMarks an attention item done (attentionItem.resolved_at set to a date-time) or reopens it (resolved_at null). Needs a fresh Idempotency-Key UUID per change.
  • send_attention_item_replySend attention item replyPOSTSENDS your plain-text reply by email into the attention item's thread, to the sender of message_id (from get_attention_item_thread), then marks the item done. Needs a fresh Idempotency-Key.

Calendar event, 5 operations

  • create_calendar_eventCreate calendar eventPOSTCreates an event on your connected calendar (primary account unless account_email is set). Use start_datetime/end_datetime for a timed event or start_date/end_date for all-day. Needs a fresh Idempotency-Key UUID per change.
  • delete_calendar_eventDelete calendar eventDELETEDeletes an event from your connected calendar by its provider id. Deleting an event you organize cancels it for all attendees.
  • get_calendar_eventGet calendar eventGETGets one calendar event by its provider id, with attendees, conferencing links and recurrence flags; searches every connected calendar when the primary one lacks it.
  • list_calendar_eventsList calendar eventsGETLists events from your connected Google or Office 365 calendars, read live (an empty list when none is connected); filter by time window and text.
  • update_calendar_eventUpdate calendar eventPATCHUpdates a calendar event by its provider id; only the fields sent change, and new times can switch it between timed and all-day. Needs a fresh Idempotency-Key UUID per change.

Custom field, 5 operations

  • create_custom_fieldCreate custom fieldPOSTCreates one custom field definition (text input, dropdown or date) for your contacts; it is ranked last. Needs a fresh Idempotency-Key UUID per change.
  • delete_custom_fieldDelete custom fieldDELETEPermanently deletes a custom field definition and every contact's value for it; 404 when it does not exist.
  • list_custom_fieldsList custom fieldsGETLists your custom field definitions (name, field_type, categories, ranking), ordered by ranking then name; no pagination.
  • reorder_custom_fieldsReorder custom fieldsPOSTSets the display ranking of up to 100 custom fields at once; unknown ids are skipped. Returns the re-ranked list. Needs a fresh Idempotency-Key UUID per change.
  • update_custom_fieldUpdate custom fieldPATCHUpdates a custom field definition (name, field_type or dropdown categories); only the keys sent change. Needs a fresh Idempotency-Key UUID per change.

Contact email, 4 operations

  • add_contact_emailAdd contact emailPOSTAdds an email address to a contact, optionally with a label such as Work; returns the created row. Needs a fresh Idempotency-Key UUID per change.
  • delete_contact_emailDelete contact emailDELETERemoves one email address from a contact.
  • reorder_contact_emailsReorder contact emailsPOSTSets the display order of a contact's emails from a list of {id, ranking}. Needs a fresh Idempotency-Key UUID per change.
  • update_contact_emailUpdate contact emailPATCHUpdates one email on a contact (address, label or ranking); only the fields sent change. Needs a fresh Idempotency-Key UUID per change.

Contact phone number, 4 operations

  • add_contact_phone_numberAdd contact phone numberPOSTAdds a phone number to a contact, optionally with a label; returns the created row. Needs a fresh Idempotency-Key UUID per change.
  • delete_contact_phone_numberDelete contact phone numberDELETERemoves one phone number from a contact.
  • reorder_contact_phone_numbersReorder contact phone numbersPOSTSets the display order of a contact's phone numbers from a list of {id, ranking}. Needs a fresh Idempotency-Key UUID per change.
  • update_contact_phone_numberUpdate contact phone numberPATCHUpdates one phone number on a contact (number, label or ranking); only the fields sent change. Needs a fresh Idempotency-Key UUID per change.

Meeting type, 4 operations

  • create_meeting_typeCreate meeting typePOSTCreates a note/meeting type (name unique per user, emoji optional); a duplicate name answers 400. Needs a fresh Idempotency-Key UUID per change.
  • delete_meeting_typeDelete meeting typeDELETEPermanently deletes a meeting type; its notes move to reassign_to, or to the plain note type when it is left out.
  • list_meeting_typesList meeting typesGETLists your note and meeting types (id, name, emoji), used as meeting_type_id on notes; no pagination.
  • update_meeting_typeUpdate meeting typePATCHRenames a meeting type or changes its emoji; only the fields sent change. Needs a fresh Idempotency-Key UUID per change.

Contact address, 3 operations

  • add_contact_addressAdd contact addressPOSTAdds a postal address to a contact; returns the created row. Needs a fresh Idempotency-Key UUID per change.
  • delete_contact_addressDelete contact addressDELETERemoves one postal address from a contact.
  • update_contact_addressUpdate contact addressPATCHUpdates one postal address on a contact; only the fields sent change. Needs a fresh Idempotency-Key UUID per change.

Contact relation, 3 operations

  • add_related_contactsAdd related contactsPOSTLinks one or more contacts to a contact as related (symmetric, no label); already-linked pairs and self-links are skipped. Needs a fresh Idempotency-Key UUID per change.
  • list_related_contactsList related contactsGETLists the contacts related to a contact (an undirected, unlabelled link), each with id, names and image_url.
  • remove_related_contactsRemove related contactsPOSTUnlinks related contacts from a contact; the contacts themselves are kept. Needs a fresh Idempotency-Key UUID per change.

Contact tag, 3 operations

  • add_tags_to_contactsAdd tags to contactsPOSTAssigns existing tags to contacts (every tag to every contact); returns affected, the number of new tag links. Needs a fresh Idempotency-Key UUID per change.
  • create_and_assign_contact_tagsCreate and assign contact tagsPOSTAssigns tags to one contact by name, creating any tag that does not exist yet; returns the resulting tag list. Needs a fresh Idempotency-Key UUID per change.
  • remove_tags_from_contactsRemove tags from contactsPOSTRemoves tags from contacts (every listed tag from every listed contact); returns affected, the number of links removed. Needs a fresh Idempotency-Key UUID per change.

Group membership, 2 operations

  • add_contacts_to_groupAdd contacts to groupPOSTAdds contacts to a group; existing members are skipped. Returns affected (new memberships) and ids. Needs a fresh Idempotency-Key UUID per change.
  • remove_contacts_from_groupRemove contacts from groupPOSTRemoves contacts from a group; the contacts themselves are kept. Returns affected and ids. Needs a fresh Idempotency-Key UUID per change.

Birthday, 1 operation

  • list_birthdaysList birthdaysGETLists every contact with a stored birthday (name, picture, job, company, birthday month, day and year, socials, emails, phones), ordered by month then day.

Contact research, 1 operation

  • research_contactResearch contactPOSTReads a contact's Dex Research note (empty body), or starts a run with run=true (uses your research quota: 100 runs a month, 50 a day). A run answers in_progress; call again without run to poll.

Custom field value, 1 operation

  • set_contact_custom_field_valuesSet contact custom field valuesPOSTSets custom field values on contacts in one call: text_value, date_value or array_value per {contact_id, custom_field_id}; mode append or prepend adds to the stored text. Needs a fresh Idempotency-Key UUID per change.

Email, 1 operation

  • list_emailsList emailsGETSearches or lists emails across all your connected mailboxes, read live (no message bodies): sender, participants, subject, snippet and a link. Covers about 6 months by default.

Timeline, 1 operation

  • get_unified_timelineGet unified timelineGETLists one paginated timeline mixing notes, reminders, emails and calendar events, filterable by contact, date window and text; each item has type, date and the record in data.

Title change, 1 operation

  • list_title_changesList title changesGETLists LinkedIn job-title changes of your contacts, newest first (title before and after, with the contact), cursor-paginated; isMajor keeps major ones.

User, 1 operation

  • get_current_userGet current userGETGets your Dex account: name, email, time zone, plan, research credits and settings flags.

View, 1 operation

  • search_viewsSearch viewsGETSearches your saved views (saved contact filters) by name; returns them in data with id, name, emoji and filters.

Use Dex from Claude Code, Cursor or Codex

Connect Dex in LiveContext, create an API key in Settings, then add the LiveContext MCP server to your client. Its Dex operations become tools the client can call, next to every other integration you connected.

Claude Code
claude mcp add --transport http livecontext https://livecontext.ai/mcp --header "X-API-Key: YOUR_API_KEY"
Codex (~/.codex/config.toml)
[mcp_servers.livecontext]
url = "https://livecontext.ai/mcp"

[mcp_servers.livecontext.http_headers]
"X-API-Key" = "YOUR_API_KEY"
Cursor, Claude Desktop and other JSON configs
{
  "mcpServers": {
    "livecontext": {
      "type": "http",
      "url": "https://livecontext.ai/mcp",
      "headers": {
        "X-API-Key": "YOUR_API_KEY"
      }
    }
  }
}

Set up the MCP server step by step

How to connect Dex

  1. Create your workspace

    Sign up free. Nothing to install.

  2. Connect Dex once

    Add your Dex connection in Settings. Every tool from this integration reuses it, and secrets are encrypted at rest and visible only to you.

  3. Describe the job in chat

    The workflow builds itself in front of you and picks the endpoints it needs. Drag the steps yourself on the canvas whenever you would rather be explicit.

Dex integration FAQ

What can you do with the Dex integration?

LiveContext exposes 103 operations on Dex, covering contact, group, favorite and tag.

Popular integrations

Browse the whole catalog