crm-cli
Your contacts, in your terminal.
Documentation
crm — your contacts, in your terminal.

A local-first personal CRM that lives in your terminal. Manage contacts, organizations, interactions, deals, and tasks — all from the command line. Ships with a built-in MCP server so AI agents like Claude can read and update your CRM directly.
Single static binary. SQLite database. No cloud. No accounts. Your data stays on your machine.
Features
- People & Organizations — contacts with full profiles, linked to companies
- Interaction Log — track calls, emails, meetings, notes, and messages
- Deals & Pipeline — sales opportunities with stages, values, and a pipeline view
- Tasks — follow-ups with due dates, priorities, and completion tracking
- Tags — labels on any entity for flexible organization
- Relationships — person-to-person links (colleague, mentor, referred-by, …)
- Full-Text Search — find anything across all entities instantly
- Context Briefing — one command to get everything about a person before a meeting
- AI-Ready — built-in MCP server for Claude and other AI agents
- Multiple Output Formats — table, JSON, CSV, TSV — pipe into anything
- Zero Dependencies — single binary, pure-Go SQLite, runs anywhere
Install
# Homebrew (macOS/Linux)
brew install jdanielnd/tap/crm
# Go
go install github.com/jdanielnd/crm-cli/cmd/crm@latest
# Or download a binary from GitHub Releases
# https://github.com/jdanielnd/crm-cli/releasesQuick Start
# Add a company
crm org add "Acme Corp" --domain acme.com
# Add a contact and link them to the org
crm person add "Jane Smith" --email jane@example.com --org 1
# Log a call
crm log call 1 --subject "Intro call"
# Get a full briefing before your next meeting
crm context 1
# See your dashboard
crm statusCommands
People
crm person add "Jane Smith" --email jane@example.com --phone 555-1234 --org 1
crm person list # all contacts
crm person list --tag vip --limit 10 # filtered
crm person show 1 # full details
crm person edit 1 --title "CTO" --company "Acme Corp"
crm person delete 1 # soft-delete (recoverable)Organizations
crm org add "Acme Corp" --domain acme.com --industry SaaS
crm org list
crm org show 1 --with-people # show org + its members
crm org edit 1 --domain acme.io
crm org delete 1Interactions
crm log call 1 --subject "Discussed roadmap" --content "Agreed on Q2 timeline"
crm log email 1 --subject "Follow-up" --direction outbound
crm log meeting 1 2 --subject "Product demo" --at "2026-03-05 14:00"
crm log note 1 --subject "Quick check-in" --content "Seemed interested"
crm log list --person 1 --limit 5 # recent interactions with personDeals
crm deal add "Website Redesign" --value 15000 --person 1 --stage proposal
crm deal list --open # exclude won/lost
crm deal list --stage proposal
crm deal show 1
crm deal edit 1 --stage won --closed-at 2026-03-15
crm deal delete 1
crm deal pipeline # summary by stageTasks
crm task add "Follow up on proposal" --person 1 --due 2026-03-14 --priority high
crm task list # open tasks
crm task list --overdue # past due
crm task list --all # include completed
crm task show 1
crm task edit 1 --priority medium
crm task done 1 # mark completed
crm task delete 1Tags
crm tag apply person 1 "vip"
crm tag apply deal 1 "q2"
crm tag show person 1 # tags on a person
crm tag remove person 1 "vip"
crm tag list # all tags
crm tag delete "old-tag" # remove tag entirelyRelationships
crm person relate 1 2 --type colleague --notes "Met at ReactConf"
crm person relationships 1 # list all relationships
crm person unrelate 1 # remove by relationship IDRelationship types: `colleague`, `friend`, `manager`, `mentor`, `referred-by`
Search
crm search "jane" # searches people, orgs, interactions, deals
crm search "roadmap" --type interaction # filter by entity typeContext Briefing
crm context 1 # full briefing by person ID
crm context "Jane Smith" # or by nameReturns person profile, organization, recent interactions, open deals, pending tasks, relationships, and tags — everything you need before a meeting.
Dashboard
crm statusShows contact/org counts, open deals with total value, task counts, overdue items, pipeline breakdown, and recent activity.
Output Formats
Every command supports `--format` / `-f`:
crm person list # table (default in TTY)
crm person list -f json # JSON (default when piped)
crm person list -f csv # CSV
crm person list -f tsv # TSVUse `-q` / `--quiet` for minimal output (just IDs), useful for scripting:
crm person list --tag vip -q | xargs -I{} crm tag apply person {} "priority"Piping & Composition
`crm` follows Unix conventions — data to stdout, messages to stderr, structured exit codes — so it plays well with other tools:
# Bulk tag everyone at an org
crm person list -f json | jq '.[] | select(.org_id == 1) | .id' | xargs -I{} crm tag apply person {} "acme-team"
# Interactive selection with fzf
crm person list -f tsv | fzf | cut -f1 | xargs crm person show
# Export contacts to CSV
crm person list -f csv > contacts.csv
# Overdue task notifications
crm task list --overdue -f json | jq -r '.[] | "OVERDUE: \(.title)"'Exit codes: `0` success, `1` error, `2` usage, `3` not found, `4` conflict, `10` database error.
AI Integration (MCP Server)
`crm` includes a built-in MCP server so AI agents can query and update your CRM over a structured protocol.
Claude Code
claude mcp add crm -- crm mcp serveThen copy `AGENT.md` into your project as `CLAUDE.md` so Claude knows how to use the CRM effectively.
Claude Desktop (macOS)
1. Open the config file at `~/Library/Application Support/Claude/claude_desktop_config.json`
2. Add the CRM server (if the file already has other servers, add the `"crm"` entry inside the existing `mcpServers` object):
{
"mcpServers": {
"crm": {
"command": "/opt/homebrew/bin/crm",
"args": ["mcp", "serve"]
}
}
}> Note: Use the full path to the binary. Homebrew on Apple Silicon installs to `/opt/homebrew/bin/crm`, on Intel Macs to `/usr/local/bin/crm`. Run `which crm` to find yours.
3. Restart Claude Desktop
4. Create a new Project, click the project settings, and paste the contents of `AGENT.md` into the project instructions. This teaches Claude when to log interactions, how to maintain contact summaries, tagging conventions, and more.
Available Tools
| Tool | Description |
|---|---|
| `crm_person_search` | Search people by name, email, tag, org |
| `crm_person_get` | Get full details for a person |
| `crm_person_create` | Create a new person |
| `crm_person_update` | Update person fields |
| `crm_person_delete` | Delete (archive) a person |
| `crm_person_relate` | Create relationship between people |
| `crm_org_search` | Search organizations |
| `crm_org_get` | Get org details with members |
| `crm_interaction_log` | Log a call, email, meeting, or note |
| `crm_interaction_list` | List interactions for a person |
| `crm_search` | Cross-entity full-text search |
| `crm_context` | Full person briefing |
| `crm_deal_create` | Create a deal |
| `crm_deal_update` | Update deal stage/fields |
| `crm_task_create` | Create a task |
| `crm_task_list` | List open tasks |
| `crm_tag_apply` | Apply a tag |
| `crm_stats` | CRM summary stats |
Example AI Workflow
After a meeting, tell Claude:
> "Just had a great meeting with Jane. We agreed on the timeline, she'll sign next week."
Claude can:
1. Log the interaction with `crm_interaction_log`
2. Update the deal stage with `crm_deal_update`
3. Create a follow-up task with `crm_task_create`
4. Update Jane's summary with `crm_person_update`
The `summary` field on contacts acts as a living dossier that AI agents maintain — reading it before meetings for context, updating it after interactions with new facts and preferences.
Configuration
The database lives at `~/.crm/crm.db` by default. Override with:
# Flag (highest priority)
crm --db /path/to/crm.db person list
# Environment variable
export CRM_DB=/path/to/crm.dbThe database and directory are auto-created on first use.
iCloud Sync (macOS)
Point your database to iCloud Drive for automatic backup across machines:
export CRM_DB="$HOME/Library/Mobile Documents/com~apple~CloudDocs/crm/crm.db"SQLite WAL mode handles concurrent reads well, but avoid writing from two machines simultaneously.
Building from Source
git clone https://github.com/jdanielnd/crm-cli.git
cd crm-cli
go build -o crm ./cmd/crm
go test ./...Requires Go 1.23+. No CGO — builds anywhere Go runs.
Tech Stack
| Component | Choice |
|---|---|
| Language | Go |
| Database | SQLite via modernc.org/sqlite (pure Go, no CGO) |
| CLI | Cobra |
| MCP | mcp-go |
| Search | SQLite FTS5 |
License
MIT
Frequently asked questions
What is crm-cli?
crm-cli is Your contacts, in your terminal.
How do I install crm-cli?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is crm-cli open source?
Yes — it is hosted on GitHub at https://github.com/jdanielnd/crm-cli and has 33 stars.
Related MCP tools
eBPF-powered network observability for Kubernetes. Indexes L4/L7 traffic with full K8s context, decrypts TLS without keys. Queryable by AI agents via MCP and humans via dashboard.
The missing open-source Kubernetes UI with a built-in MCP server for AI agents. See what's broken, why, and what changed. Issues, Topology, event timeline, Helm, GitOps, live service traffic, and cluster audits - all in one Go binary.
mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnostics.
One place to manage & connect to all your MCP servers
Open-source AI agent firewall for MCP security and agent egress. Scans mediated HTTP, MCP, A2A, and WebSocket traffic for exfiltration, SSRF, and prompt injection, and emits mediator-signed action receipts: verifiable audit evidence from outside the agent.
⚡ 需求分析效率提升 200%!全球首个为 AI 编程时代设计的团队协作 MCP 服务器,自动分析需求自动编写前后端代码,下载切图
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP