FavCRM — Agentic CRM
**Agentic CRM for service businesses** — 136 typed tools across customers,
目录 / 电商办公 / Groundbase CRM
Groundbase is a CRM for a business of one, and this is its hosted MCP server. Nothing to install: point Claude, ChatGPT, Cursor or any MCP client at https://mcp.groundbasecrm.com/mcp and authorise with OAuth or a Groundbase API key. Most CRM connectors let an assistant look things up. Groundbase's 119 tools do the work: send a text or email through your own Twilio and Resend accounts, start a drip that stops when someone replies, run a workflow, draft and send an invoice, book a meeting, update a deal. "Text the three people I quoted last week" ends with three texts sent. Requires a Groundbase account: $9 a month flat, no tiers, 14-day free trial. Every call is scoped to your own account and every authorisation is revocable from Settings. Not for teams: no shared inbox, permissions or manager reporting. Your data is yours: export every contact, deal and invoice at any time.
https://groundbase--adam-jsdb.run.tools{
"mcpServers": {
"Groundbase CRM": {
"headers": {
"Authorization": "Bearer \u003cYOUR_KEY\u003e"
},
"url": "https://groundbase--adam-jsdb.run.tools"
}
}
}
| 工具 | 说明 |
|---|---|
| contacts_list | List the user's contacts with optional search/pagination. Use this to find a contact before calling get/update/delete, or to summarize who's in the CRM. Defaults to 50 results; pass `limit` up to 200 for more. |
| contacts_get | Fetch a single contact by id, including tags, addresses, custom fields, and recent activity. |
| contacts_create | Create a new contact. At minimum, provide first_name or last_name or email — at least one of those is required. Phone numbers should be E.164 (+1...) when known; the API will normalize. |
| contacts_update | Patch an existing contact. Only include fields you want to change — omitted fields are left as-is. Pass an empty string to clear a field (vs. omitting it which keeps the current value). |
| contacts_delete | Soft-delete a contact (the row is hidden from lists but kept for audit/restore). DESTRUCTIVE — confirm with the user before calling unless they explicitly asked to delete. |
| sms_send_now | Send an SMS message to a phone number immediately. The recipient phone must be in E.164 format (+1...). Cost is billed at $0.025/segment (160 GSM chars per segment, 70 unicode). Pass contactId when available so the message attaches to that contact's thread. |
| sms_send_scheduled | Schedule an SMS message for future delivery. `scheduledAt` must be an ISO 8601 timestamp in the future (UTC or with offset). The per-minute cron dispatches scheduled messages as their time arrives. Same billing as send_now — final balance debit happens at fire time, so a top-up between scheduling and sending works. |
| sms_list_scheduled | List the user's pending scheduled SMS messages (status='scheduled', not yet sent). Useful for showing the user what's queued up or finding a message id to cancel. |
| sms_cancel_scheduled | Cancel a scheduled SMS that hasn't been sent yet. Only works while status='scheduled' — already-delivered messages can't be unsent. Returns 404 if the id is unknown or already fired. |
| sms_list_thread | List recent SMS messages in a thread with a specific phone number — useful for showing the last few exchanges before drafting a reply. |
| companies_list | List the user's companies. Use this to find a company before linking a contact to it, or to summarize accounts in the CRM. Note: like contacts.list, the current API caps the response server-side; pagination params are advisory until the cap is lifted. |
| companies_get | Fetch a single company by id (includes employees, deals, addresses, custom fields). |
| companies_create | Create a new company. Name is required. Website should include the protocol (https://...). Tags are created on the fly if missing. |
| companies_update | Patch a company. Only include fields you want to change. |
| companies_delete | Soft-delete a company. Contacts and deals previously linked to this company become unlinked but are NOT deleted themselves. DESTRUCTIVE — confirm with the user first. |
| deals_list | List deals. Returns all open + closed deals with their stage, value, contact, and company. Use this to summarize pipeline, find a deal to update, or filter by stage / value. |
| deals_get | Fetch a single deal by id, including notes, tasks, and the contact/company linked. |
| deals_create | Create a deal. title + stageId required. valueCents is in CENTS (so $1,500 = 150000). Link to a contact via contactId or a company via companyId (you can also pass both). |
| deals_update | Patch a deal. Only include fields to change. |
| deals_move_stage | Move a deal to a different pipeline stage. Common stage names are "Lead", "Qualified", "Proposal", "Won", "Lost", but the actual stages and their UUIDs are per-user — call deal_stages.list first if you don't know the destination stage id. |
| deals_delete | Soft-delete a deal. DESTRUCTIVE — confirm first. |
| deal_stages_list | List the user's pipeline stages in order. Call this BEFORE creating a deal or moving one between stages so you have the correct stage UUIDs. Returns name, color, position, and id. |
| tasks_list | List tasks/events/meetings for the user. Filter by `kind`, `status`, `contactId`, or date range. Defaults to showing open (status=open) items of all kinds. |
| tasks_get | Fetch a single task/event/meeting by id. |
| tasks_create | Create a task, event, or meeting. • `task` — has dueAt + optional recurrence. • `event` — has startAt + endAt. • `meeting` — has startAt + endAt + location. Title is required. Link to a contact (contactId), company (companyId), or deal (dealId). |
| tasks_update | Patch a task. Only include fields to change. |
| tasks_complete | Mark a task done. For recurring tasks, the server automatically spawns the next occurrence so the series keeps going — you don't need to create it manually. |
| tasks_delete | Soft-delete a task. DESTRUCTIVE — confirm first. |
| notes_list | List notes attached to a contact, company, or deal. Use this to show recent context before drafting a follow-up. Pass exactly one of contactId / companyId / dealId. |
| notes_create | Add a note to a contact, company, or deal. Notes are plain text and appear on the entity's timeline alongside calls, texts, and emails. Provide EXACTLY ONE of contactId / companyId / dealId. |
| notes_update | Edit an existing note's text. |
| notes_delete | Soft-delete a note. DESTRUCTIVE — confirm first. |
| tags_list | List all tags the user has defined. Useful before applying a tag to find its UUID, or to see what tags already exist before creating new ones. |
| tags_create | Create a new tag. Name is required. Color is a hex string like "#B91C1C". |
| tags_update | Rename a tag or change its color. |
| tags_delete | Delete a tag. Contacts previously tagged with it lose the tag but are NOT deleted. DESTRUCTIVE — confirm first. |
| tags_apply | Apply a tag to one or more contacts in bulk. Idempotent — contacts already tagged are skipped without error. Returns count of contacts the tag was newly applied to. |
| tags_remove | Remove a tag from one or more contacts in bulk. Idempotent. |
| sms_templates_list | List the user's SMS templates. Each template has a name, body, and (for email) subject. Use this to find an existing template before drafting a new one. |
| sms_templates_get | Fetch a single SMS template by id. |
| sms_templates_create | Create a new SMS template. Use {{first_name}} / {{last_name}} / {{full_name}} / {{company}} placeholders — they're substituted at send time. Returns the new template id. |
| sms_templates_update | Edit an existing SMS template. |
| sms_templates_delete | Soft-delete a SMS template. DESTRUCTIVE — confirm first. |
| email_templates_list | List the user's EMAIL templates. Each template has a name, body, and (for email) subject. Use this to find an existing template before drafting a new one. |
| email_templates_get | Fetch a single EMAIL template by id. |
| email_templates_create | Create a new EMAIL template. Use {{first_name}} / {{last_name}} / {{full_name}} / {{company}} placeholders — they're substituted at send time. Subject is required for email templates. Returns the new template id. |
| email_templates_update | Edit an existing EMAIL template. |
| email_templates_delete | Soft-delete a EMAIL template. DESTRUCTIVE — confirm first. |
| email_send | Send an email from the user's connected email account. `to` can be a single address or a comma-separated list. Provide `bodyHtml` (preferred), `bodyText` (plain), or both — at least one is required. Pass `contactId` when sending to a Groundbase contact so merge tags like {{first_name}} and {{cf.<field_key>}} resolve and the message threads against that contact. The user's saved signature is appended automatically. |
| dashboard_summary | Get top-of-app KPI summary: total contacts, open deals + their total value, won deals + their total value, messages sent/received this period. Plus a 30-day series for charting. |
| activity_list | Recent activity feed: SMS sent/received, calls, emails, notes added, deal stage changes, task completions. Returns most recent first. Use this to summarize "what happened with X" or build a weekly digest of CRM activity. |
| workflows_list | List the user's workflows with their trigger summary, step count, active/paused state, and last-run timestamp. Use this to see what automations exist before creating new ones or before modifying an existing one. |
| workflows_get | Fetch one workflow by id, including the full step tree and condition. Use this after workflows_list to inspect details before editing. |
| workflows_create | Create a workflow. `trigger_type` is one of "entity_event" (fires on contact.created etc.), "scheduled" (cron/one-time), "inbound_webhook" (when a Groundbase inbound webhook receives a POST), or "manual" (only fired by workflows_run_now). For entity_event, set trigger_event to e.g. "contact.created", "deal.stage_changed", "task.completed". For scheduled, pass trigger_config like { recurrence: "one_time"|"daily"|"weekly"|"hourly", run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone? }. For inbound_webhook, trigger_event is the inbound webhook id from inbound_webhooks_list. Steps run sequentially. Step shapes: `send_sms` { to?, body }; `send_email` { to, subject, body_html?, body_text?, contact_id? }; `apply_tag` { tag_name, entity_id?, entity_type? }; `remove_tag` { tag_name, entity_id?, entity_type? }; `create_note` { body, entity_type?, entity_id? }; `create_task` { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; `fire_webhook` { url, method?, headers?, body? }; `update_field` { entity_type?, entity_id?, field, value } — restricted to a safe allow-list of native columns (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); `set_custom_field` { entity_type?, entity_id?, field_key, value } — writes to a custom field defined in Settings → Custom fields. field_key accepts "loan_amount" or "cf.loan_amount" (the cf. prefix is optional); `delay` { delay_seconds }; `branch` { condition: { all|any: [{ field, op, value }] }, then: [Step], else: [Step] }. Templates supported in string fields: {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}. Step ids auto-generated as s_<8hex> if omitted; pass an explicit "id" to make {{steps.X.output.Y}} references stable across edits. |
| workflows_update | Patch a workflow. Only include fields you want to change. Useful for tweaking step config, updating the trigger event, switching trigger types (e.g. from manual to entity_event), or rewording the name. To toggle active/paused state, prefer workflows_pause / workflows_resume. NOTE: changing triggerType to entity_event or inbound_webhook usually means you also want to pass triggerEvent in the same call — otherwise the workflow may end up in an inconsistent state where the type is set but no matching event is configured. |
| workflows_pause | Pause a workflow so it stops firing on its trigger. Existing runs continue but no new ones start. Reversible via workflows_resume. |
| workflows_resume | Resume a paused workflow so it starts firing on its trigger again. |
| workflows_delete | Soft-delete a workflow. DESTRUCTIVE — confirm with the user before calling unless they explicitly asked to delete. |
| workflows_run_now | Manually fire a workflow on a specific entity, bypassing its trigger. Useful for testing a workflow you just authored, or for one-off automations the user invokes by name (e.g. "run my onboarding workflow on John Doe"). The entity must already exist; the workflow's trigger context is synthesized as { entity_type, entity_id, payload }. |
| inbound_webhooks_manage | Manage inbound webhooks (URLs the world POSTs to so Groundbase creates contacts/deals/tasks/etc.). Dispatched by `action`: - "list": list all of the user's inbound webhooks (URL token NOT returned). No other args. - "get": fetch one by id (URL token NOT returned). Requires `id`. - "create": author a new webhook. Returns the FULL URL with token ONCE — flag this to the user; it cannot be retrieved later. Most senders use mappingMode="native"; use "mapped" only when the sender has a fixed payload shape that needs translating. signingSecret is OPTIONAL. Requires `name`. - "update": patch fields. Requires `id`. Only pass the fields you want to change. - "delete": DESTRUCTIVE. The URL stops accepting POSTs immediately. Confirm with the user first. |
| outbound_webhooks_manage | Manage outbound webhook subscriptions (Groundbase POSTs to a URL whenever a subscribed event fires). Dispatched by `action`: - "list": list all the user's subscriptions. No other args. - "get": fetch one by id (without the signing secret). Requires `id`. - "create": subscribe a URL to events. Returns the signing secret ONCE — flag this to the user. Always supply a `name` so the user can tell multiple subscriptions apart in the list. Requires `name`, `url`, `events`. Valid event names: contact.created, contact.updated, contact.deleted, company.created, company.updated, company.deleted, deal.created, deal.updated, deal.deleted, deal.stage_changed, task.created, task.updated, task.completed, task.deleted, note.created, tag.applied, sms.sent, sms.received, sms.delivered, sms.failed, call.completed, voicemail.received, email.sent. Use "*" wildcard to subscribe to all events. - "update": patch fields. Requires `id`. Only pass the fields you want to change. To rotate the signing secret, recreate the subscription (current API has no rotate endpoint). - "delete": DESTRUCTIVE. Stops new deliveries; in-flight retries are abandoned. Confirm with the user first. |
| cadences_list | List the user's cadences — name, description, on/off, step count, and currently-active enrollment count. Use this to see what sequences exist before creating new ones. |
| cadences_get | Fetch one cadence by id, including its full step list (ordered, with config + delays). Use after cadences_list to inspect what the cadence does. |
| cadences_create | Create a new cadence. Name + steps[] are required. Step shapes: `send_sms` { body, from_number? }; `send_email` { subject, body_html?, body_text?, from_email?, from_name? }; `create_task` { title, notes?, is_priority? }; `create_note` { body }; `apply_tag` { tag_name | tag_id }; `remove_tag` { tag_name | tag_id } — tag_name auto-creates the tag if it does not exist; `update_field` { field, value } — writes a native column on the contact (allow-list: first_name, last_name, email, phone, phone_secondary, position, city, source, notes, company_id, primary_phone); `set_custom_field` { field_key, value } — writes a custom field defined in Settings → Custom fields. field_key accepts "loan_amount" or "cf.loan_amount" (cf. prefix optional). Each step also takes delay_days (0-365) and delay_hours (0-23) defining the wait BEFORE the step fires (relative to the previous step or to enrollment for step 1). Set delay 0/0 to fire immediately. Templates supported in every string field: {{first_name}}, {{last_name}}, {{full_name}}, {{email}}, {{phone}}, {{company_name}}, {{cf.<field_key>}} (custom-field values). Use isActive=false to create a paused draft you can review before enrolling anyone. triggerType controls how contacts get into the cadence — see triggerType param doc. |
| cadences_update | Patch a cadence. Include only the fields to change. Passing `steps` REPLACES the entire step list (in-flight enrollments are rewound to step 0). Use cadences_pause / cadences_resume as the shorthand for the active/paused toggle. NOTE: switching triggerType to "entity_event" usually wants triggerEvent in the same call. |
| cadences_pause | Pause a cadence so new enrollments are blocked. Existing in-flight enrollments KEEP running. Use cadences_resume to re-enable, or cadences_unenroll on the specific enrollments to stop in-flight contacts too. |
| cadences_resume | Resume a paused cadence so new enrollments are accepted again. |
| cadences_delete | Soft-delete a cadence + stop all in-flight enrollments. DESTRUCTIVE — confirm with the user before calling unless they explicitly asked to delete. |
| cadences_enroll | Enroll one or more contacts in a cadence. Pass `contactId` for one contact, OR `contactIds` for many (up to 500 per call). Contacts already actively enrolled in this cadence are silently skipped to avoid double-sends. Returns { enrolled, skipped }. |
| cadences_list_enrollments | List a cadence's enrollments — contact, current step, status (active|paused|completed|stopped), next-fire time, and stopped reason if any. Use this to see who is currently in the sequence and how far along each contact is. |
| cadences_unenroll | Stop an in-flight enrollment so no further steps fire for this contact. Already-fired steps stay in the run history. Reversible only by re-enrolling, which restarts from step 1 — there's no resume-where-they-left-off. |
| custom_fields_list | List the user's defined custom fields. Returns each field's `field_key` (the identifier used in `{{cf.<field_key>}}` merge tags and in custom_fields_set_value), `name` (human label), `type` (text|number|date|select), `options` (for select fields), and `entity_type` (contact|company|deal). Call this before authoring email/SMS templates or cadences that reference custom field merge tags. |
| custom_fields_create | Define a new custom field on contacts, companies, or deals. Use this when the user mentions tracking a piece of data the CRM doesn't have a built-in column for (e.g. "track each contact's loan amount", "add a 'referral source' field"). `field_key` is auto-generated from `name` (snake_case) unless provided. After creation, the field is immediately available as a `{{cf.<field_key>}}` merge tag in every email/SMS composer. |
| custom_fields_update | Rename a custom field or change its dropdown options. Cannot change `entity_type` or `field_key` (create a new field if you need either). Cannot change `type` (data integrity). |
| custom_fields_delete | Delete a custom field definition. All values stored on contacts/companies/deals for this field are removed too. Irreversible. |
| custom_fields_set_value | Set or update a custom field value on a specific contact, company, or deal. Use this when a user says "Casey is a Hot lead" (sets cf.lead_temp=Hot on Casey) or "Bob's loan amount is $250k". Resolves the field by `field_key` — call custom_fields_list first if you need to know what keys are available. Passing value=null clears the field. |
| merge_tags_list | List every merge tag the user can use in SMS bodies, email subjects, email bodies, cadence steps, and workflow actions. Returns reserved tags ({{first_name}}, {{full_name}}, {{company_name}}, etc.) PLUS per-user contact custom fields exposed as {{cf.<field_key>}}. Call this BEFORE drafting any template with merge tags so you can be certain every tag will resolve at send time. Unknown tags render empty server-side, which is silent and confusing — checking this first prevents that. |
| voicemail_drops_list | List the user's saved voicemail drops. Each drop has a `name`, `has_audio` flag (drops without audio can't be dropped — user needs to record/upload/Emma-generate first), `duration_ms`, `source` (user or emma_tts), and `script_text` for Emma-generated drops. Call this before voicemail_drops_drop so you know which drop_id to use. |
| voicemail_drops_create | Create a new empty voicemail drop. It has no audio yet — follow up with voicemail_drops_generate_emma to give it Felicia's voice, or have the user record by phone in the app. Returns the new drop's id. |
| voicemail_drops_generate_emma | Synthesize the drop's audio in Emma's voice (Felicia, ElevenLabs). Overwrites any existing audio. Server bills per character of input against the user's communications credit balance (50¢ per 1000 characters at standard tier; the response includes cost_cents). 2000-character cap (~2 minutes spoken). Inline emotion tags work — e.g. [warm], [chuckles], [whispers]…[/whispers]. The user can edit + re-generate later; script_text is persisted on the drop. |
| voicemail_drops_drop | Drop a pre-recorded voicemail on a contact's voicemail box. The Worker initiates a Twilio call with machine-detection; Twilio waits for the voicemail to pick up, plays the audio, then hangs up. NEVER plays at a live person — if AMD detects a human, Twilio hangs up silently. Standard voice rates apply ($0.05/min). Requires the drop to have audio (check has_audio via voicemail_drops_list). |
| campaigns_manage | CRUD + send-control verbs for marketing campaigns (email or SMS, single send for v1). Use action='list' to see what's there; action='create' to author a new draft; action='update' to modify a draft (only allowed when status is draft/scheduled/paused); action='send_now' to dispatch immediately to the audience; action='test_send' to fire a single message to one address for preview. `content` for email = { subject, preheader?, from_name?, from_email?, blocks: [...] }. Each block is { type, props }. Block types: text (props.html: HTML), header (props.html: text, props.level: 1|2|3), image (props.src: url, props.alt, props.width), button (props.text, props.url, props.bgColor?), divider (props.color?), spacer (props.height: px). `content` for SMS = { body: text, media_urls?: [urls] }. Merge tags inside any string field: {{first_name}}, {{last_name}}, {{full_name}}, {{email}}, {{phone}}, {{company_name}}, {{cf.<custom_field_key>}}. Unknown tags render empty. `audience_filter` shape: { all: [rules], any?: [rules] }. Rules are {type, ...}. Supported in v1: { type: "all_contacts" } — every contact with a valid channel address; { type: "tag", op: "has" | "has_not", value: "<tag_name>" } — tag membership filter. Multiple all[] rules AND together; any[] rules OR together. Behavior queries (opened campaign X / clicked X) and custom-field queries arrive in a follow-up. |
| campaigns_analytics | Aggregated stats for one campaign — recipients, sent, delivered, opened (unique), clicked (unique), bounced, unsubscribed, replied, failed, plus total open + click counts. Use this to answer 'how did my last newsletter perform' or to pick the best-performing campaign. |
| campaigns_list_recipients | List per-recipient status for one campaign — who got it, who opened, who clicked, who bounced. Returns contact_id + email/phone + status + per-event timestamps for each row. Optionally filter by status (e.g. status='opened' for everyone who opened). Use this to answer 'who didn't open my newsletter so I can follow up' or 'who clicked the call-to-action so I can prioritize them in outreach'. |
| campaigns_preview_audience | Resolve a campaign audience filter and return the count + 5 sample contacts WITHOUT creating a campaign. Use to validate an audience before action='create'. Example: confirm "tag=lead" matches the expected number of contacts. |
| resend_manage | Manage the BYO Resend integration that powers email campaigns. action='status' returns connection + domain verification state. action='disconnect' wipes stored creds. action='test_send' fires a one-shot email through the connected account. 'connect' is NOT exposed here because pasting an API key into a chat is a credential hazard; users must connect Resend from Settings → Email in the UI. |
**Agentic CRM for service businesses** — 136 typed tools across customers,
Cavyro is an agentic CRM, wired into the place your customers already message you
A verified directory of 300+ go-to-market tools across CRM, data enrichment, analytics, and billing
Connect your store, CRM, subscription and Search Console accounts once
# Kash MCP Server — Official Integration
7 outreach, sequencing, call-coaching and CRM-hygiene skill products
侵权举报经核验成立后,我们会即时下线该条目并删除已存的内容副本。