FavCRM

by favcrm

414 downloads
Not rated
GitHub Website

About

FavCRM is an agentic CRM for service businesses. Its public MCP server exposes **190+ typed tools** — bookings, customers, loyalty, WhatsApp/SMS/email, invoicing — at **100% annotation coverage** (read-only / destructive / open-world labelled; outbound sends approval-gated). Any

Details

Author
favcrm
Downloads
414
Categories
Communication

- 190+ typed tools with 100% annotation coverage (read-only / destructive / open‑world)
- Approval‑gated outbound WhatsApp/SMS/email messaging (agent drafts, user approves)
- Agentic registration – the agent creates the account itself via email OTP
- One backend with three on‑ramps: AI agent, booking page, or WhatsApp inbox
- Tools for bookings, deposits, customers, segments, loyalty, membership, invoicing

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name FavCRM
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Point your MCP client to https://api.favcrm.io/mcp. Get a key via agentic registration (from inside the agent) or by calling POST /v6/mcp/keys. OAuth 2.0 (PKCE‑S256) is also supported. Transport is Streamable HTTP. One‑command install via Smithery: smithery mcp add favcrm/favcrm.

search_members

Search and filter members/accounts. Supports text search, date ranges, booking/activity history, membership tier, tags, and more. Use lastBookingBefore/inactiveDays to find inactive members.

get_member_profile

Get detailed profile for a specific member/account by ID.

preview_customer_import

Preview a bulk customer import (max 2000 rows). Matches existing accounts by phone/email and shows create vs update actions plus points/stamps/credit deltas. Use commit_customer_import with the returned sessionId to apply.

commit_customer_import

Commit a previewed customer import. Pass the same rows and sessionId returned by preview_customer_import. Creates/updates accounts and applies points, stamps, and credit deltas.

create_account

Create a CRM account/customer with a primary contact. Optionally enroll the account as a member; use enrol_membership later when the account already exists.

update_account

Update CRM account/customer profile fields such as name, phone, email, life stage, owner, notes, or member code.

delete_account

Soft-delete a CRM account/customer. This releases the primary phone for future reuse while keeping account history for audit.

list_tags

List all available tags for the merchant.

create_tag

Create a CRM tag for customer segmentation and organization.

update_tag

Rename or recolor an existing CRM tag.

delete_tag

Delete a CRM tag and remove it from all tagged entities.

attach_tags

Attach one or more tags to a member/account. Useful for segmenting members after filtering.

detach_tags

Detach one tag from one or more member/account records.

list_tiers

List all membership tiers with member counts and stats.

get_membership_tier

Get a specific membership tier by ID.

issue_rewards

Issue a gift/reward to multiple members. Requires a gift offer ID and member IDs.

enrol_membership

Enrol a member into a membership tier. Free tiers enrol immediately; paid tiers return PAYMENT_REQUIRED unless skipPriceCheck is set. Use list_tiers first to find the target tier.

get_loyalty_balance

Get a member's current loyalty balance — points, stamps, credits, lifetime totals, and active membership tier. Returns null if the member is not enrolled.

earn_loyalty_points

Credit loyalty points or stamps to a member. Use field="points" for points, "stamps" for stamps. Server records a transaction with the reason as audit context.

get_dashboard_stats

Get high-level business KPIs: member count, new members this week, active subscriptions, total points issued, active promotions, rewards redeemed, messages sent.

list_bookings

List bookings with filters for date range, status, service, staff, or member.

get_booking_detail

Get full booking details including line items, status history, and participants.

get_booking_stats

Get booking counts: today, this week, this month, and breakdown by status.

get_available_slots

Find available booking slots for a service on a specific date.

list_services

List booking services with name, price, duration, and status.

get_service_detail

Get full service details including addons, staff, resources, and tier pricing.

create_service

Create a bookable service. Sets duration, price, capacity, and policies. Use list_service_categories first if you want to attach to an existing category.

update_service

Update an existing booking service. Pass only the fields you want to change.

create_service_schedule

Create a bookable schedule window for a service, including recurring weekly/daily availability.

list_service_schedules

List schedule windows for booking services.

update_service_schedule

Update a service schedule window. Pass only fields to change.

assign_staff_to_service

Assign a staff member to a booking service. Pass users.id from list_staff.userId.

link_resource_to_service

Link a room/resource to a booking service.

list_service_categories

List service categories (groups for booking services like "Treatments", "Classes").

create_service_category

Create a service category (e.g. "Treatments", "Classes") to group bookable services.

create_resource

Create a bookable resource (room, equipment, vehicle). Used by services that have requiresResource=true.

set_resource_availability

Add an availability window for a resource. Use day-of-week + recurring=true for weekly schedules, or a specific date for one-off blocks.

set_staff_availability

Add an availability window for a staff member (companyMembers.id). Use day-of-week + recurring for weekly schedules, or a specific date for one-off changes.

get_booking_settings

Get global booking settings for the customer booking flow, cancellation rules, visibility options, and confirmation requirements.

update_booking_settings

Update global booking settings. Pass only the fields you want to change.

list_tickets

List support tickets with optional filters.

get_ticket_stats

Get ticket counts grouped by status.

create_ticket

Create a support ticket for a member issue.

update_ticket_status

Update the status of an existing support ticket.

list_surveys

List surveys with optional status/search filters.

create_survey

Create a survey with custom question blocks. Publish it later or set status to published for immediate portal access.

get_survey

Get survey detail, including blocks, publishing status, visibility, settings, and response count.

update_survey

Update a survey draft or publishing configuration. Use questionBlocks to replace the ordered form block list.

archive_survey

Archive a survey and remove it from active survey lists.

get_survey_stats

Get response and invitation metrics for a survey overview dashboard.

get_survey_responses

List responses for a survey.

list_survey_invitations

List survey invitation history without exposing token hashes or old invitation tokens.

create_survey_invitation

Create a token-auth survey invitation for a specific member/account or contact.

list_survey_workflows

List automation workflows attached to a survey.

upsert_survey_workflow

Create or update a survey automation workflow, usually triggered by survey_response_submitted.

list_deals

List CRM deals (sales pipeline) with optional filters.

get_deal

Get detailed CRM deal information by ID.

create_deal

Create a CRM sales pipeline deal, optionally linked to a customer account and contact.

update_deal

Update a CRM deal. Pass only fields to change; use null for nullable links/fields to clear them.

delete_deal

Soft-delete a CRM deal from the sales pipeline.

update_deal_stage

Move a deal to a different pipeline stage.

mark_deal_won

Mark a CRM deal as won and set close date.

mark_deal_lost

Mark a CRM deal as lost. Requires a lost reason.

convert_lead

Convert an account: qualify its open lead (creating one if needed) and link exactly one pipeline deal. Also promotes lifeStage lead -> active. Safe to repeat — a second call lands on the same lead and deal. Works on accounts that are already active.

list_contacts

List contacts (people linked to CRM accounts), optionally filtered by account or search.

get_contact

Fetch a single contact by ID.

create_contact

Create a contact on an existing CRM account.

update_contact

Update fields on an existing contact.

set_primary_contact

Set a contact as the primary contact for its CRM account and demote other contacts on that account.

delete_contact

Delete a secondary contact. Primary contacts are protected; set another primary contact or delete the account instead.

list_custom_fields

List custom field definitions for CRM entities such as account, contact, deal, or booking.

get_custom_field

Get a custom field definition by ID.

create_custom_field

Create a custom field definition for CRM entities. Use options for select or multiselect fields.

update_custom_field

Update a custom field definition label, type, options, required flag, or sort order.

delete_custom_field

Delete a custom field definition and its stored values.

get_custom_field_values

Get custom field values for a CRM entity such as an account, contact, deal, or booking.

set_custom_field_values

Set or clear custom field values for a CRM entity. Values are stored as strings; pass null to clear a value.

list_tasks

List tasks with optional status, assignee, and account filters.

get_task

Get detailed task information by ID.

create_task

Create a task. Optionally link to a CRM account or assign to a team member.

update_task

Update a task (status, priority, assignee, due date, completion).

delete_task

Soft-delete a CRM task.

search_crm

Search across CRM accounts and contacts by name, email, or phone.

list_invoices

List invoices with optional filters. Use status "OVERDUE" to find unpaid invoices past due date.

get_invoice

Fetch a single invoice with line items, payment history, and customer detail.

create_invoice

Create a new invoice for a customer. Optionally include line items inline. Returns the new invoiceId.

record_invoice_payment

Record a manual payment against an invoice (cash, bank transfer, cheque, card terminal). Updates invoice status to PARTIAL or PAID based on the running total.

mark_invoice_sent

Mark an invoice as sent to the customer (transitions DRAFT → OPEN). Use after delivering the invoice via email or share link. Idempotent.

void_invoice

Void an invoice. Destructive — invoice can no longer be paid or edited; existing payments are preserved as history. Cannot void invoices that are already PAID or VOIDED.

delete_invoice

Delete a DRAFT invoice. Only invoices that have never been sent can be deleted; otherwise use void_invoice.

restore_invoice

Restore a previously deleted DRAFT invoice.

get_invoice_stats

Outstanding totals, overdue counts, and revenue this period. Used by the weekly-snapshot playbook.

list_subscriptions

List member subscriptions. Filter by status to find active, cancelled, or past-due subscriptions.

get_subscription

Fetch a single subscription with customer, tier, billing cycle, and renewal info.

create_subscription

Create a manual, non-renewing subscription record for a member. Use a subscription action link for provider-backed recurring billing.

pause_subscription

Pause an active subscription (status → past_due, no further auto-renew). Use resume_subscription to reactivate.

resume_subscription

Resume a paused subscription back to active.

cancel_subscription

Cancel a subscription. Destructive — turns off auto-renew and prevents further billing cycles. Existing paid periods stay valid until end.

list_campaigns

List marketing campaigns (email, SMS, WhatsApp) with delivery stats.

create_campaign

Create a marketing campaign (email, SMS, or WhatsApp) in DRAFT. For email channelConfig, use subject + htmlBody + optional plainTextBody. recipientSource="list" is accepted as an alias for "individual".

update_campaign

Update an existing campaign. Channel cannot be changed after creation. Pass only fields to change.

delete_campaign

Delete a campaign. Only allowed in DRAFT status; sent campaigns are kept for audit history.

restore_campaign

Restore a previously deleted campaign.

validate_campaign

Validate a campaign before sending. Resolves contactable recipient count and previews the final email subject/body without sending.

list_notification_logs

List notification delivery logs for the current company. Recipients are masked by default for incident-response safety.

list_conversations

List messaging conversations across WhatsApp, Messenger, Instagram, Threads, SMS, email, and other enabled channels. Threads items are public conversations. Shows unread counts and last message time.

create_broadcast

Create a DRAFT WhatsApp or SMS broadcast campaign. The broadcast is NOT sent — admin must review and send it from the Broadcasts page.

list_audit_logs

List recent audit log entries for this company. Filter by action, resource, resourceId, user, source, outcome, destructive flag, and created date range.

search_audit_logs

Search audit logs by free text across action, resource, resource ID, changes JSON, and metadata JSON.

get_audit_log

Fetch a single audit log entry by ID, including before/after snapshots when available.

revert_audit_action

Revert an audited action by restoring the captured before snapshot. Only works for allowlisted target tables with full before/after audit snapshots.

clone

Duplicate an existing record (product, tier, campaign, post, service package, promotion, gift offer). Creates a copy in DRAFT status with "(Copy)" appended to the name.

list_notes

List notes attached to a member/account, booking, or ticket.

create_note

Add a note to a member/account, booking, ticket, or invoice.

confirm_booking

Confirm a pending booking.

cancel_booking

Cancel a booking and create a durable refund receipt. Uses the merchant refund setting unless refundMethod is provided.

complete_booking

Mark a booking as completed. Triggers commission calculation if configured.

mark_no_show

Mark a booking as no-show when the customer did not attend.

list_promotions

List promotion/coupon codes with optional status filter.

get_promotion

Get details of a specific promotion/coupon code.

create_promotion

Create a promotion / discount code. type=percentage or fixed_amount; value is the discount as a string ("10" = 10% or 10 currency units). Codes are uppercased server-side.

update_promotion

Update an existing promotion. Pass only the fields you want to change.

delete_promotion

Delete a promotion. Past usage records are preserved.

restore_promotion

Restore a previously deleted promotion.

validate_promotion

Check if a promotion code is valid for a given order. Returns isValid, discount amount, and an error code/message if invalid. Use before applying to a checkout.

list_reward_schemes

List loyalty reward schemes (points/stamps programs) configured for this business.

list_staff

List staff/team members in the business.

list_resources

List booking resources (rooms, equipment, etc.).

list_service_packages

List service packages/prepaid session bundles with optional search, status, sorting, and pagination.

get_service_package

Get service package detail including applicability and selected booking service/event items.

create_service_package

Create a service package/prepaid session bundle. Use applicableType=SELECTED with applicableItems to limit the package to specific booking services or events.

update_service_package

Update an existing service package. Pass only the fields you want to change.

delete_service_package

Delete a service package by ID.

restore_service_package

Restore a previously deleted service package by ID.

get_plan_status

Show the current organisation plan, subscription/payment state, enabled modules, and quota usage. Use before deciding whether an agentic operation is allowed.

check_plan_operation

Preflight whether an intended operation is allowed by token scopes, enabled modules, subscription state, and quota. Provide toolName, quotaCode, or moduleCode.

list_plan_options

List active FavCRM plans with prices, quotas, included modules, and whether each is the current plan.

create_plan_upgrade_link

Create a Stripe Checkout link for a new paid subscription, or a Stripe Billing Portal link for an existing Stripe subscription. Use only after the user explicitly asks to upgrade or fix billing.

create_team_member_invite

Invite a team member to this company and return a one-time MCP accept token. The invited user must verify an email code through accept_team_invite_request and accept_team_invite_verify before membership and API key issuance.

accept_team_invite_request

Step 1 of agentic team invite acceptance. Validates an invite token and sends a 6-digit verification code to the invited email. Then call accept_team_invite_verify with the code to join and receive an MCP API key.

accept_team_invite_verify

Step 2 of agentic team invite acceptance. Verifies the emailed code, joins the invited user to the company, and returns a one-time MCP API key for that user.

get_whatsapp_connection_status

Check whether WhatsApp Business is connected for this company, including WABA/phone metadata and the latest agentic connect session state.

create_whatsapp_connect_link

Create a short-lived browser link for WhatsApp Business Embedded Signup. The user must open the link because Meta requires a browser popup to authorize and choose the WABA/phone number.

list_my_companies

List all companies/organisations the current user has access to. Use this to see available orgs before switching.

switch_company

Switch the current session to a different company/organisation. Returns a new access token scoped to the target company. All subsequent tool calls will operate on the new company.

list_posts

List CMS posts (blog posts and/or pages) with optional filters.

get_post

Get detailed CMS post including content blocks, categories, and tags.

create_post

Create a new CMS post (blog_post, page, or any custom post type). The post type must already exist — use list_post_types to discover, create_post_type to add a new one. excerpt = plain-text summary only (auto-derived from blocks if omitted). Structured custom fields go in meta, keyed by the field schema defined with create_post_type_field.

update_post

Update an existing CMS post (any post type). Only provided fields are changed.

delete_post

Delete a CMS post by ID. Soft-deleted posts can be restored with restore_post.

restore_post

Restore a previously deleted CMS post.

list_image_models

List AI image-generation models exposed to merchants (sanitized — provider/cost details hidden). Use to pick a `modelCode` for `generate_post_cover`.

generate_image

Generate an AI image via kie.ai and return its public R2 URL. Use to mint reusable URLs for content blocks (image, gallery), product photos, or any field that takes an image URL — does NOT attach to a post by itself. Costs credits (see list_image_models). On poll timeout the job continues running; pass `jobId` from the response to merchant ai-media APIs to retrieve it later.

generate_post_cover

Generate an AI image and attach it as a post's featuredImage. Submits a kie.ai job, polls until complete, copies the result into the canonical post-asset R2 folder, and writes the public URL onto the post. Costs credits (see list_image_models). On poll timeout, the job continues — call attach_post_cover_from_job(postId, jobId) once it finishes to attach without paying again.

attach_post_cover_from_job

Attach a previously generated ai-media job's output as the post's featuredImage. Use when generate_post_cover timed out (job kept running) or when reusing the same generation across multiple posts. Verifies the job belongs to your company and succeeded. Does NOT charge credits — credits were charged at submit time.

upload_post_cover_from_url

Download an external image URL into R2 and attach it as the post's featuredImage. Replaces the manual flow of pasting external URLs (which break when the source goes down). Validates content-type starts with `image/` and rejects payloads larger than 20 MB. No AI credits charged — only standard storage.

list_categories

List CMS post categories.

create_category

Create a CMS post category (e.g. "Equipment", "Injection — Botox"). For sub-categories, use namespaced names — the table is flat.

update_category

Update a CMS post category.

delete_category

Delete a CMS post category. Posts in the category are not deleted; they are simply unlinked.

restore_category

Restore a previously deleted CMS post category.

list_post_types

List all post types defined for this company (built-in: blog_post, page; plus any custom types).

create_post_type

Define a new custom post type (e.g. "treatment", "service"). Required before creating posts of that type. After creating a post type, use create_post_type_field to define its structured field schema. Those fields are stored in meta on each post — do not use excerpt for structured data.

list_post_type_fields

List the custom field schema for a post type. Use this before creating posts to know which keys to pass in meta and what types they expect.

create_post_type_field

Add a custom field to a post type schema. The field key becomes the key in meta when creating/updating posts. Use fieldType="repeater" with fields=[...] for repeatable structured rows. Use this instead of storing structured data in excerpt.

update_post_type

Update a custom post type. Built-in types (blog_post, page) cannot be modified.

delete_post_type

Delete a custom post type. Built-in types cannot be deleted. Fails if any posts of this type still exist — delete those first.

restore_post_type

Restore a previously deleted custom post type.

update_post_type_field

Update a field on a post type schema. Changing fieldType or flipping required=true is blocked when posts already use the field unless force=true is passed.

delete_post_type_field

Remove a field from a post type schema. Blocked when posts of this type still have data in the field unless force=true is passed (orphans the data).

restore_post_type_field

Restore a previously deleted field on a post type schema.

reorder_post_type_fields

Reorder fields on a post type. Pass field IDs in the desired display order; sortOrder is updated to match.

append_post_block

Append one or more blocks to the end of a post. Each block must be a valid block object: { id, version, type, data }. Types: paragraph, heading, image, list, quote, code, divider, spacer, embed, html, youtube, file, faq, callout, gallery, cta, accordion, product.

replace_post_block

Replace a single block at the given index (0-based). Avoids fetching the full post and re-sending all blocks via update_post.

remove_post_block

Remove the block at the given index (0-based). All subsequent blocks shift up by one.

reorder_post_blocks

Reorder blocks by passing block IDs in the desired order. The id list must contain every existing block id exactly once.

create_booking

Create a new booking for a member. Use get_available_slots first to find valid times, then create the booking with the service, member, date, and time.

get_conversation_messages

Get messages from a specific conversation thread. Shows the chat history between the merchant and a contact.

find_or_create_workroom_thread

Find or create a Workroom DM thread between a merchant user and an AI colleague. Use this when an inbound event deserves owner attention but no threadId was provided. This only prepares an internal Workroom channel.

get_attachment_text

Read the text/Markdown content of a file attached to a Workroom thread or sent by a customer (PDF, image, or document). Extracts on first read and caches the result. Returns status "ready" with markdown, or "skipped"/"failed"/"not_found" with a reason. Use when a message references an attachment you need to read.

post_workroom_message

Post an internal message from an AI colleague into a Workroom thread. Use this to report findings, ask the owner for approval, or share source links after reading CRM/Inbox data. This does not send anything to customers.

create_inbox_reply_suggestion

Create a draft reply suggestion that appears inline in the FavCRM Inbox composer. Use this for message.inbound events with replyPolicy="suggest"; it does not send anything to the customer.

request_send_approval

Create a merchant-owned Workroom approval request for a customer-facing send. The agent must not call send_message, send_whatsapp_message, send_test_campaign, or send_campaign directly.

list_segments

List customer segments. Segments group members by criteria for targeted campaigns.

get_segment

Get customer segment details including type, criteria, and live member count.

get_segment_members

Get the members that belong to a specific segment.

create_segment

Create a new customer segment. Use STATIC for manual member lists, DYNAMIC for criteria-based auto-filtering.

update_segment

Update an existing customer segment by id. Pass only the fields to change; criteria replaces the existing rules.

preview_segment_count

Preview how many customers would match dynamic segment criteria before creating or updating a segment.

set_segment_members

Replace the members of a STATIC customer segment with the given account IDs. The segment is converted to STATIC.

delete_segment

Delete a customer segment.

list_templates

List the company's WhatsApp message templates with their Meta approval status (PENDING / APPROVED / REJECTED). Check this to see which templates are approved before referencing one in a campaign.

create_template

Create and submit a WhatsApp message template to Meta for approval. Text templates only (header text, body with {{1}} variables, footer) — add buttons in the app. The template is NOT usable until Meta approves it (check with list_templates). Submitting consumes the store’s Meta template allowance.

list_outlets

List shop outlets/locations for the company.

create_outlet

Create a shop outlet/location. Optionally pass id to preserve a legacy UUID during migration.

update_outlet

Update an existing shop outlet/location by ID.

list_products

List shop products with optional filters by name, status, or category.

get_product

Get full product detail including images, options, and variations.

create_product

Create a new shop product as DRAFT. Merchant can review and activate from the portal.

update_product

Update an existing product. Only provided fields are changed.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "favcrm": {
            "favcrm": {
                "url": "https://api.favcrm.io/mcp",
                "headers": {
                    "Authorization": "Bearer ${env:FAVCRM_API_KEY}"
                }
            }
        }
    }
}

McpServers

{
    "favcrm": {
        "url": "https://api.favcrm.io/mcp",
        "headers": {
            "Authorization": "Bearer ${env:FAVCRM_API_KEY}"
        }
    }
}

FavCRM — Agentic CRM for service businesses

FavCRM is a CRM for service businesses (salons, studios, clinics, coaches, tutors, shops) with a public MCP server. Any MCP client — Claude, Cursor, ChatGPT — can register a workspace and operate a real CRM backend from chat: bookings with deposits, customers, loyalty, WhatsApp/SMS/email messaging, and invoicing.

Why it's different

- 190+ typed tools at 100% annotation coverage — every tool is labelled read-only / destructive / open-world, so the agent knows the blast radius before it calls. - Approval-gated sends — outbound WhatsApp/SMS/email need explicit confirmation; the agent drafts, you approve. No accidental blasts. - Agentic registration — the agent creates the account itself, no signup form: register_organisation_request → email OTP → register_organisation_verify returns a fav_mcp_ key. - One backend, three on-ramps — use it via an AI agent, a booking page, or a WhatsApp inbox.

Setup (~60 seconds, no card)

Point your client at https://api.favcrm.io/mcp: \\\json { } } \\\ Get a key via agentic registration (from inside the agent) or POST /v6/mcp/keys. OAuth 2.0 (PKCE-S256) is also supported. Transport: Streamable HTTP. One-command install via Smithery: smithery mcp add favcrm/favcrm.

Tools

Bookings & deposits · customers & segments · loyalty/points · membership tiers · WhatsApp/SMS/email messaging (approval-gated) · invoicing · org registration & key issuance.

Pricing

Free tier: 100 customers, 200 bookings/month, 1k MCP calls/month — no card. Paid: agentic/AI-CRM plans from $49/mo; Booking Lite from $9.90/mo; WhatsApp CRM from $19/mo.

Links

Server: https://api.favcrm.io/mcp · Docs: https://favcrm.io/mcp · https://favcrm.io/developers
No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.