Less Annoying CRM MCP server. Read and write Less Annoying CRM contacts, notes, tasks, events, pipelines and groups.
Add to your MCP config, then reload & authorize:
{
"mcpServers": {
"less-annoying-crm": {
"url": "https://less-annoying-crm.usefulapi.io/mcp"
}
}
}| Tool | Type | What it does |
|---|---|---|
lacrm_get_user | read | Get the current user Return the user who owns this API key — UserId, name, email and timezone. A cheap way to confirm the key works, and the UserId to use for AssignedTo. LACRM: GetUser. |
lacrm_list_users | read | List users List the users on the account that you can see (admins see all), with their UserIds — needed to assign contacts, tasks or filter by owner. LACRM: GetUsers. |
lacrm_search_contacts | read | Search contacts and companies Search (or list) contacts and companies. With no search_terms, returns everything visible, paged. Returns { HasMoreResults, Results }. LACRM: GetContacts. |
lacrm_get_contact | read | Get a contact or company Fetch one contact or company record with all its fields (emails, phones, addresses, custom fields, owner). LACRM: GetContact. |
lacrm_list_notes | read | List notes List notes, newest first by default — across the whole CRM, or for one contact. Filter by date range and author. LACRM: GetNotes. |
lacrm_list_tasks | read | List tasks List tasks due in a date range, optionally only incomplete/complete, for given users. If contact_id is given, ALL of that contact's tasks are returned regardless of dates or status. LACRM: GetTasks. |
lacrm_list_events | read | List calendar events List calendar events in a date range, filterable by user or calendar. If contact_id is given, all events attached to that contact are returned and other filters are ignored. LACRM: GetEvents. |
lacrm_list_pipelines | read | List pipelines List the account's pipelines (e.g. Sales Leads) with their statuses (StatusId, Name, IsActive) and optionally their custom fields. This is the setup, not the items — use lacrm_list_pipeline_items for those. LACRM: GetPipelines. |
lacrm_list_pipeline_items | read | List pipeline items List the items in one pipeline (deals, leads...), optionally only in given statuses or for given users. An empty status filter returns items in all ACTIVE statuses. LACRM: GetPipelineItems. |
lacrm_get_contact_pipeline_items | read | Get a contact's pipeline items All pipeline items attached to one contact or company, grouped by pipeline. LACRM: GetPipelineItemsAttachedToContact. |
lacrm_list_groups | read | List groups List the contact groups you can see (GroupId, Name, Sharing, Color), optionally with member counts. LACRM: GetGroups. |
lacrm_list_contacts_in_group | read | List contacts in a group List the contacts that are members of one group. Identify the group by group_id (preferred) or group_name — not both. LACRM: GetContactsInGroup. |
lacrm_get_contact_groups | read | Get a contact's groups List the groups one contact or company belongs to. LACRM: GetGroupsAttachedToContact. |
lacrm_list_custom_fields | read | List custom fields List the account's field definitions (name, type, options) for contacts, companies or pipelines — use the Name values as keys in custom_fields when creating/editing contacts. LACRM: GetCustomFields. |
lacrm_create_contact | write | Create a contact or company Create a new contact (person) or company record. For a person, company_name links them to that company (creating it if needed). Company names must be unique. If assigned_to is omitted, the record is assigned to the API key's own user (one extra GetUser call). Returns { ContactId }. LACRM: CreateContact. |
lacrm_edit_contact | write | Edit a contact or company Update fields on an existing contact or company. Only the fields you pass change; omitted fields are left alone. Multi-value fields (email, phone, address, website) are REPLACED by the list you pass. Set is_company=true when renaming a company. LACRM: EditContact. |
lacrm_create_note | write | Add a note to a contact Attach a plain-text note to a contact or company's history (newlines kept, HTML/markdown escaped). Returns { NoteId }. LACRM: CreateNote. |
lacrm_create_task | write | Create a task Create a to-do on a user's task list (date only, no time — use lacrm_create_event for timed things). Optionally attach it to a contact. Returns { TaskId }. LACRM: CreateTask. |
lacrm_edit_task | write | Edit or complete a task Update a task — including marking it complete (is_complete=true) or re-opening it (false). Only passed fields change. LACRM: EditTask. |
lacrm_create_event | write | Schedule a calendar event Create a timed (or all-day) event on your calendar, optionally with contacts/users as attendees. The timezone of start_date becomes the event's timezone. Returns { EventId }. LACRM: CreateEvent. |
lacrm_create_pipeline_item | write | Add a contact to a pipeline Create a pipeline item (deal, lead...) on a contact in a given pipeline and status, with an optional note. Returns { PipelineItemId }. LACRM: CreatePipelineItem. |
lacrm_update_pipeline_item | write | Move or annotate a pipeline item Move a pipeline item to another status (e.g. Prospect → Won) and/or add a note to its history. LACRM: EditPipelineItem. |
lacrm_add_contact_to_group | write | Add a contact to a group Add a contact or company to a group (creates a group membership). Identify the group by group_id (preferred) or group_name — not both. LACRM: CreateGroupMembership. |
lacrm_usage_status | Usage status (free-tier meter) Report the caller's current free-tier usage this month: calls used, monthly limit, remaining, and whether the cap is reached. Read-only; does not count against the meter. | |
lacrm_upgrade | Upgrade to Pro (unlimited) Subscribe to the Pro plan for UNLIMITED Less Annoying CRM tool calls (the free tier caps monthly usage). Choose monthly ($9/month) or yearly ($90/year — 2 months free) billing. Returns a Stripe Checkout link to open in your browser; after payment your account upgrades automatically. Read-only; does not count against the meter. |
| Plan | Price | Limit |
|---|---|---|
| Free | $0 | 100 tool calls / month |
| Proper user | $9/mo · $90/yr | Unlimited |
This is a Model Context Protocol endpoint — meant to be connected from an AI client, not opened in a browser. An invalid_token response at the URL is the auth gate working as designed; clients authenticate automatically.