Install
openclaw skills install @ocruzv/dex-skillManage your Dex personal CRM — search, filter, create, archive, and update contacts; log notes; manage follow-ups, tags, groups, and custom fields; search connected email; and read or manage connected calendars. Use this skill to: (1) Find, add, or update contacts, (2) Log meetings and notes, (3) Ma
openclaw skills install @ocruzv/dex-skillDex is a personal CRM that helps users maintain and nurture their professional relationships. It tracks contacts, interaction history, reminders, and organizational structures (groups, tags, custom fields).
Check which access method is available, in this order:
dex_search_contacts and other dex_* tools are in the tool list, use MCP tools directly. This is the preferred method — skip CLI setup entirely.dex command exists (run which dex or dex auth status). If authenticated, use CLI commands.Path A — Platform supports MCP (Claude Desktop, Cursor, VS Code, Gemini CLI, etc.):
If the user already has the Dex MCP server configured, or their platform can add MCP servers:
npx -y add-mcp https://mcp.getdex.com/mcp -y
This auto-detects installed AI clients and configures the Dex MCP server for all of them. User authenticates via browser on first MCP connection.
Path B — Install CLI:
npm install -g @getdex/cli
Works with npm, pnpm, and yarn. No postinstall scripts — the binary is bundled in a platform-specific package.
Keeping the CLI up to date:
The CLI auto-generates commands from the MCP server's tool schemas at build time. When tools are added or updated on the server, users need to update the CLI to get the new commands. If a user reports a missing command or parameter, suggest updating:
npm install -g @getdex/cli@latest
Path C — No Node.js:
Direct the user to follow the setup guide at https://getdex.com/docs/ai/mcp-server — it has client-specific instructions for Claude Desktop, Claude Code, Cursor, VS Code, and other MCP-capable clients.
Triggered by /dex-login or on first use when not authenticated. Prefer MCP browser OAuth when available, then device code for an interactive CLI session, and API keys for CI or when the user explicitly chooses one.
Option 1 — API Key:
dex auth --token dex_your_key_here in their own terminal~/.dex/api-key (chmod 600)Never ask the user to paste an API key into chat. Do not print, log, commit, or include it in tool arguments that will be shown back to the user.
Option 2 — Device Code Flow (works on remote/headless machines):
Drive this flow directly via HTTP — no browser needed on the machine:
Request a device code:
curl -s -X POST https://mcp.getdex.com/device/code -H "Content-Type: application/json"
Response: { "device_code": "...", "user_code": "ABCD-EFGH", "verification_uri": "https://...", "expires_in": 600, "interval": 5 }
Show the user the user_code and verification_uri. They open the URL on any device with a browser, log in to Dex, and enter the code.
Poll for approval every 5 seconds without logging the successful response:
curl -s -X POST https://mcp.getdex.com/device/token \
-H "Content-Type: application/json" \
-d '{"device_code": "<device_code>"}'
{"error": "authorization_pending"} → keep pollingapi_key → stop polling and save it without rendering the valueCreate the protected destination, then use local secret-aware parsing to write only the api_key value directly to it:
install -d -m 700 ~/.dex
umask 077
Write the parsed key bytes to ~/.dex/api-key without printing them and ensure the file mode is 600. If the execution surface cannot keep the successful response out of chat or tool logs, stop and ask the user to complete CLI authentication in their own terminal.
For CI/automation with no human present, use the API key method with DEX_API_KEY environment variable.
Contact
├── Emails, Phone Numbers, Social Profiles
├── Company, Job Title, Birthday, Website
├── Description (rich text notes about the person)
├── Tags (flat labels: "Investor", "College Friend")
├── Groups (collections with emoji + description: "🏢 Acme Team")
├── Custom Fields (user-defined: input, dropdown, datepicker)
├── Notes/Timeline (interaction log: meetings, calls, coffees)
├── Reminders (follow-up tasks with optional recurrence)
└── Starred / Archived status
Call dex_* tools directly. All tools accept and return JSON.
Use the dex command. CLIHub generates subcommands from MCP tool names (replacing _ with -):
dex dex-search-contacts --query "John"
dex dex-list-contacts --limit 100
dex dex-create-contact --first-name "Jane" --last-name "Doe"
dex dex-list-tags
dex dex-create-reminder --text "Follow up" --due-at-date "2026-03-15"
Use --output json for machine-readable output, --output text (default) for human-readable.
Run dex --help for all commands, or dex <command> --help for command-specific help.
See CLI Command Reference for the full mapping table of all 47 tools to CLI commands.
choose search/filter/list → get details (with notes if needed)
dex_search_contacts for keywords or real geographic proximity with near and optional radius_kmnear, keep query for an additional non-location filter; do not repeat the place in both fieldsdex_filter_contacts for structured AND filters such as tags, groups, company, profile presence, dates, archived state, and custom fieldsdex_list_contacts for unfiltered bulk iteration (up to 500 per page, cursor-paginated)include_notes: true when user needs interaction historycreate contact → (optionally) add to groups → apply tags → set reminder
Bulk import (CSV, spreadsheet, list):
batch create contacts → add to group → create note for all
dex_create_contact with the contacts array (up to 100 per call) for batch creationdex_add_contacts_to_groupdex_create_note with contact_ids to log a shared note across all imported contacts(optional) list note types → create note on contact timeline
dex_list_note_types to pick the right one (Meeting, Call, Coffee, Note, etc.)event_time to when the interaction happened, not when logging itcontact_ids (plural) to link a single note to multiple contacts (e.g. a group meeting)set cadence or create reminder → complete/snooze when due
dex_update_contact.keep_in_touch for relationship cadence; use a reminder for a specific taskdue_at_date (ISO format: "2026-03-15")text for the reminder description — there is no separate title fieldweekly, biweekly, monthly, quarterly, biannually, yearlydex_complete_keep_in_touch without snooze_days after a real interaction; use snooze_days to defer without recording a touchTags — flat labels for cross-cutting categories:
create tag → add to contacts (bulk)
Groups — named collections with emoji and description:
create group → add contacts (bulk)
Best practice: Use tags for attributes ("Investor", "Engineer", "Met at Conference X") and groups for relationship clusters ("Startup Advisors", "Book Club", "Acme Corp Team").
list fields → create field definition → batch set values on contacts
input (free text), autocomplete (dropdown with options), datepickerdex_set_custom_field_values to set values on multiple contacts at oncecategories array with the allowed optionsWhen a user says "I have a meeting with X":
include_notes: truedex_list_calendar_events for a time window or plain-text event search across all connected Google/Microsoft accountsemail as account_email for get/update/deleteaccount_provider when the same address is connected to both providers; dex_get_calendar_event currently accepts only account_emailstart_datetime and end_datetime with explicit offsets; include an IANA timezonestart_date; end_date is exclusive and defaults to the next dayattendees replaces the whole list; fetch the event first and include everyone who should remainAn update cannot move an event between connected accounts. To transfer one, fetch the original, confirm creating a replacement on the target account, then separately confirm deleting the original. Preserve the full attendee list and details, and warn that organizer identity, RSVP state, conferencing data, and provider notifications may change.
If a calendar write fails for missing provider scope, direct the user to Settings → Sync & Integrations → Grant calendar access for that account.
dex_search_emails for live, read-only search across all connected Google/Microsoft mailboxesfrom: and to: are neutralizedafter and before for precise date ranges; otherwise the search covers roughly the last six monthsPrefer reversible cleanup:
dex_archive_contacts for contacts the user may want laterdex_filter_contacts and archived_only: truedex_archive_contacts and archived: falseFor duplicates:
search for potential duplicates → confirm with user → merge
mergedContactIds from the response to learn which ID survivedFor multi-contact or multi-step requests, follow this reusable contract:
define scope → inspect current state → preview proposed outcome → confirm writes → execute → verify
Load CRM Workflows for detailed playbooks when the user asks to:
include_notes and include_contacts off unless relationship context is necessarydex_search_emails returns only metadata and snippetsOnly responses with has_more and next_cursor use cursor pagination:
dex_list_contacts: default 100 per page, max 500dex_filter_contacts: default 50 per page, max 200has_more in responsenext_cursor from previous response to get next pagehas_more: false to get all resultsdex_search_contacts, dex_list_calendar_events, and dex_search_emails return a bounded single batch, not a cursor. Narrow the query or date range when necessary.
Respect MCP host confirmations. In CLI mode, explicitly summarize the target and consequence before any operation that deletes, overwrites, removes relationships, archives, completes cadence state, changes external calendar state, or may send invitations.
High-risk examples:
Before a destructive call, resolve names to current IDs, read the current record when overwriting a collection, show the intended delta, and never guess ambiguous targets.
For contact cleanup, do not define “stale” from inactivity alone. Review open reminders and active relationship signals, present exact archive/retain lists, and require approval before archiving or changing cadence. Date filters exclude contacts with no recorded interaction, so review those separately when they matter.
Responses are capped at 25,000 characters. Cursor-based tools preserve next_cursor and has_more; continue with a smaller page. For single-batch search, calendar, and email tools, reduce limit or narrow the query/date range.
"2026-03-15", "2026-03-15T14:30:00Z")YYYY-MM-DDYYYY-MM-DDend_date: exclusive