Cofounder CLI
CRM
Track the companies, people, and deals you sell to, log what happened with each, and find new prospects.
Every company gets a built-in CRM: accounts (companies), contacts (people), and opportunities (deals), plus a log of calls, emails, meetings, and notes.
Get the overview
| MCP | CLI | API |
|---|---|---|
crm_summary_get | cofounder crm summary get | GET /cofounder-cli/v1/crm/summary |
crm_search | cofounder crm search --query <text> | GET /cofounder-cli/v1/crm/search |
Start with the summary for questions like "what's going on with Acme?" — it
covers accounts, contacts, deals, and recent activity in one call. search
finds records by name or text; add --object-type account, contact, or
opportunity to narrow it. MCP clients can also show the CRM as a board with
crm_summary_show.
Accounts, contacts, and deals
| MCP | CLI | API |
|---|---|---|
crm_accounts_list | cofounder crm accounts list | GET /cofounder-cli/v1/crm/accounts |
crm_accounts_get | cofounder crm accounts get --account-id <id> | GET /cofounder-cli/v1/crm/accounts/{account_id} |
crm_accounts_create | cofounder crm accounts create --name <name> --domain <domain> | POST /cofounder-cli/v1/crm/accounts |
crm_accounts_update | cofounder crm accounts update <account-id> --status customer | PATCH /cofounder-cli/v1/crm/accounts/{account_id} |
crm_accounts_delete | cofounder crm accounts delete <account-id> | DELETE /cofounder-cli/v1/crm/accounts/{account_id} |
crm_contacts_list | cofounder crm contacts list --account-id <id> | GET /cofounder-cli/v1/crm/contacts |
crm_contacts_get | cofounder crm contacts get --contact-id <id> | GET /cofounder-cli/v1/crm/contacts/{contact_id} |
crm_contacts_create | cofounder crm contacts create --name <name> --email <email> --account-id <id> | POST /cofounder-cli/v1/crm/contacts |
crm_contacts_update | cofounder crm contacts update --contact-id <id> --title <job-title> | PATCH /cofounder-cli/v1/crm/contacts/{contact_id} |
crm_contacts_delete | cofounder crm contacts delete <contact-id> | DELETE /cofounder-cli/v1/crm/contacts/{contact_id} |
crm_contacts_merge | cofounder crm contacts merge <contact-id> --merge-contact-id <id> | POST /cofounder-cli/v1/crm/contacts/{contact_id}/merge |
crm_opportunities_list | cofounder crm opportunities list --account-id <id> | GET /cofounder-cli/v1/crm/opportunities |
crm_opportunities_get | cofounder crm opportunities get --opportunity-id <id> | GET /cofounder-cli/v1/crm/opportunities/{opportunity_id} |
crm_opportunities_create | cofounder crm opportunities create --account-id <id> --name <name> --stage lead | POST /cofounder-cli/v1/crm/opportunities |
crm_opportunities_update | cofounder crm opportunities update <opportunity-id> --stage proposal | PATCH /cofounder-cli/v1/crm/opportunities/{opportunity_id} |
crm_opportunities_delete | cofounder crm opportunities delete <opportunity-id> | DELETE /cofounder-cli/v1/crm/opportunities/{opportunity_id} |
Search or list before you create. If a new account's domain, or a new
contact's email, matches a record you already have, you get that record back
instead of a duplicate. Every deal belongs to an account; --amount-cents is
the amount times 100 in the deal's --currency (150000 is $1,500).
update changes only the fields you pass. To avoid overwriting someone
else's edit, pass the record's updated_at as --expected-updated-at: the
update is refused if the record changed since you read it. delete is
permanent.
crm contacts merge folds a duplicate into the contact you keep (<contact-id>);
--merge-contact-id is the duplicate, which is deleted. It is permanent, with no
undo. Its activities, refs and opportunities move to the kept contact, and
do-not-contact stays set if either contact had it.
The merge and its crm.contacts.merged audit event commit together; if the event
cannot be recorded, the merge rolls back. Retrying as the same actor with the
same keeper returns the keeper's current record and does not add another event.
A retry with a different actor or keeper conflicts.
To tie an account to a known company record, find the profile first and pass
its id as --company-profile-id when creating the account:
| MCP | CLI | API |
|---|---|---|
crm_company_profiles_search | cofounder crm company-profiles search --query <name> | GET /cofounder-cli/v1/crm/company-profiles |
Fill in details
| MCP | CLI | API |
|---|---|---|
crm_accounts_enrich | cofounder crm accounts enrich --account-id <id> --request-id <uuid> | POST /cofounder-cli/v1/crm/accounts/{account_id}/enrich |
crm_contacts_enrich | cofounder crm contacts enrich --contact-id <id> --request-id <uuid> | POST /cofounder-cli/v1/crm/contacts/{contact_id}/enrich |
Enriching looks up company or person data from a paid provider and fills in
whatever it finds. Each lookup costs money, and there's no spending cap
you can set. Use a new UUID as --request-id for every new lookup; reuse one
only to recover the same attempt, so you aren't billed twice. If a call's
response gets lost, check the record before trying again. A record enriched
recently is skipped unless you pass --force-refresh.
Log activity
| MCP | CLI | API |
|---|---|---|
crm_activity_create | cofounder crm activity create --title <title> --links <json> | POST /cofounder-cli/v1/crm/activity |
crm_activity_list | cofounder crm activity list --object-type account --object-id <id> | GET /cofounder-cli/v1/crm/activity |
create logs a note, email, call, meeting, or task (--activity-type);
--links is a JSON list of the accounts, contacts, or opportunities it's
about. It can also store metadata and a --source-ref that keeps the same
event from being logged twice. When there's a real email thread, recording, or document
behind it, pass its link as --evidence-url.
activity list shows everything, newest first; pass --object-type and
--object-id together for one record, or --occurred-after to fetch only
what's new.
Sync from your calendar
| MCP | CLI | API |
|---|---|---|
crm_calendar_sync_settings_get | cofounder crm calendar-sync settings get | GET /cofounder-cli/v1/crm/calendar-sync/settings |
crm_calendar_sync_preview | cofounder crm calendar-sync preview --calendar-id <id> | POST /cofounder-cli/v1/crm/calendar-sync/preview |
crm_calendar_sync_enable | cofounder crm calendar-sync enable --calendar-id <id> | POST /cofounder-cli/v1/crm/calendar-sync/enable |
crm_calendar_sync_disable | cofounder crm calendar-sync disable | POST /cofounder-cli/v1/crm/calendar-sync/disable |
crm_calendar_sync_retry | cofounder crm calendar-sync retry | POST /cofounder-cli/v1/crm/calendar-sync/retry |
With a calendar connected, the CRM can create accounts, contacts, and
activity from your meetings. settings get lists your calendars and their
ids and whether sync is on. preview counts what sync would create without
writing anything. enable turns it on, looking back 30 days by default
(--backsync-days). Attendees on personal email domains are skipped unless
you pass --include-personal-domains, and sync reads only basic event
details unless you pass --visibility-mode full. retry re-runs records
that failed to sync; disable turns sync off, for all calendars or just the
ones you name with --calendar-id.
Find new prospects
| MCP | CLI | API |
|---|---|---|
crm_prospects_preview | cofounder crm prospects preview --entity-type company --targeting <json> --max-cost-usd <usd> | POST /cofounder-cli/v1/crm/prospects/preview |
crm_prospects_find | cofounder crm prospects find --entity-type company --targeting <json> --max-cost-usd <usd> | POST /cofounder-cli/v1/crm/prospects/find |
crm_prospects_import | cofounder crm prospects import --job-id <id> --row-id <row-id> | POST /cofounder-cli/v1/crm/prospects/import |
cofounder crm prospects preview --entity-type company \
--targeting '{"industries":["dental clinics"],"hq_countries":["US"]}' \
--max-cost-usd 25
cofounder research jobs get --job-id <job-id>
cofounder research jobs results get --job-id <job-id>preview checks your targeting and estimates the cost without spending
anything. find takes the same settings, spends up to --max-cost-usd,
and returns a job id right away while the search runs in the background.
Follow it with research jobs get, read the candidates with
research jobs results get, then import the rows you want as accounts or
contacts — no research is repeated. People without a LinkedIn profile come in
as unverified contacts. Pass your own --idempotency-key to find: if the
response gets lost, run it again with the same key and settings and you
won't start a second search.
See Research for more on jobs.