LACRM MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LACRM_API_KEY | Yes | Your Less Annoying CRM API key (required). Can also be provided via config file at ~/.lacrm-config.json. | |
| LACRM_BULK_RUNS_DIR | No | Directory for bulk run state files (default: a 'lacrm-bulk-runs' folder under the OS temp dir) | <temp_dir>/lacrm-bulk-runs |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_workflow_guideA | START HERE: Get the workflow guide for using this LACRM MCP effectively. This tool explains:
Call this tool first when connecting to understand how to use the MCP correctly. |
| get_custom_fieldsA | Retrieve custom field definitions for this LACRM account. Use this tool FIRST when you need to work with contacts or pipeline items that have custom fields. IMPORTANT: Returns field details including:
Filter options:
Example: To create a pipeline item, first call get_custom_fields with record_type="Pipeline" and the pipeline_id. Then use the field names as keys in custom_fields: { "FieldName": "value" } |
| get_pipeline_custom_fieldsA | Get custom fields for a specific pipeline - use this before creating or editing pipeline items. Returns all custom fields configured for the pipeline with:
WORKFLOW:
Example response interpretation: { "name": "Deal Stage", "required": true, "type": "Dropdown", "valid_options": ["Prospect", "Qualified", "Proposal"] } → You MUST include this field, value must be exactly "Prospect", "Qualified", or "Proposal" |
| get_pipelinesA | Retrieve all pipeline definitions for this LACRM account. Use this tool to discover available pipelines and their statuses before creating or editing pipeline items. Returns pipeline IDs, names, icons, and status definitions with sort order. Each pipeline has multiple statuses that represent stages (e.g., "Lead", "Qualified", "Closed"). Use the PipelineId and StatusId values when creating or editing pipeline items. WORKFLOW for pipeline items:
|
| get_groupsA | Retrieve all contact groups defined in this LACRM account. Use this tool to discover available groups before adding contacts to groups. Returns group IDs, names, and descriptions. Groups are used to organize contacts (e.g., "VIP Customers", "Newsletter Subscribers"). Use the GroupId when managing group memberships. |
| get_usersA | Retrieve all users in this LACRM account. Use this tool to discover user IDs when you need to assign contacts, tasks, or events to specific users. Returns user IDs, names, emails, and roles. User IDs are required when creating events on a specific user's calendar or assigning tasks. |
| get_calendarsA | Retrieve all calendars in this LACRM account. Use this tool to discover calendar IDs when creating events. Returns calendar IDs, names, and associated user IDs. Each user typically has their own calendar. Use CalendarId when creating calendar events. |
| get_contact_schemaA | Get complete field schema for creating/editing contacts. Returns ALL fields (both fixed system fields and custom fields) with:
ALWAYS call this before creating a contact to understand what data is needed. |
| get_company_schemaA | Get complete field schema for creating/editing companies. Returns ALL fields (both fixed system fields and custom fields) with:
ALWAYS call this before creating a company to understand what data is needed. Note: Companies are created using create_contact with is_company=true. |
| get_pipeline_item_schemaA | Get complete field schema for creating/editing pipeline items. Requires pipeline_id because each pipeline has different custom fields. Returns ALL fields (both fixed system fields and custom fields) with:
WORKFLOW:
|
| create_contactA | Create a new contact or company in Less Annoying CRM. PREREQUISITES (call these first):
Use this tool when you need to add a new person or company to the CRM. Set is_company to true to create a company record instead of a person. Supports flat-string shortcuts: use email_address, phone_number, or website_url for single values instead of the array format. Supports custom_field_names for name-based custom field resolution. Returns the new ContactId on success. |
| edit_contactA | Update an existing contact or company in Less Annoying CRM. PREREQUISITES (call these first):
Use this tool to modify contact details like name, email, phone, etc. Only include fields you want to change - other fields remain unchanged. Supports flat-string shortcuts: use email_address, phone_number, or website_url for single values. Supports custom_field_names for name-based custom field resolution. |
| delete_contactA | Permanently delete a contact or company from Less Annoying CRM. WARNING: This action cannot be undone. The contact and all associated data will be removed. Required: contact_id. Use search_contacts or get_contact to find valid contact IDs before deleting. |
| get_contactA | Retrieve a single contact or company by ID. Use this when you already have a ContactId and need the record. NOTE: search_contacts returns the same full data for each match. Only use get_contact when you have an ID but not the data (e.g., from a webhook or external reference). |
| get_contacts_by_idsA | Retrieve multiple contacts or companies by their IDs. Use this when you have a list of ContactIds (e.g., from webhooks or external references). RETURNS FULL DATA: Each result includes all contact fields - same as search_contacts or get_contact. Maximum 10,000 results per call. |
| search_contactsA | Search for contacts and companies with filters and sorting. Use this tool to find contacts by name, email, or other criteria. RETURNS FULL DATA: Each result includes all contact fields (name, email, phone, address, company, custom fields, timestamps, etc.) - no need to call get_contact afterward. Supports:
IMPORTANT: For geographic searches (by state, city, zip), use advanced_filters with the address fields (AddressState, AddressCity, AddressZip, etc.) instead of search_terms. Free-text search_terms scans all fields and can be very slow on broad terms. Use count_only=true for accurate counts on large datasets without returning the full result set. Use get_custom_fields to learn available custom field names for advanced filtering. |
| bulk_generate_templateA | Generate a ready-to-fill CSV template for a bulk operation, plus a per-field report describing exactly what happens when each column is populated, left blank, or omitted. The template is generated from the SAME field configuration the validate/execute tools use, so it always reflects the rules that will actually be applied. Supply the field configuration as arguments; nothing about any specific CRM is built in. Returns: { csv, columns, report } where report[].behavior explains each field's merge strategy. Columns are ordered LACRM built-in fields first (key, owner name, address block, then other standard fields), then custom fields. |
| bulk_validate_csvA | Validate a bulk CSV against a field configuration WITHOUT making any changes. Reports row count, which configured columns are present (will be acted on) vs absent (left unchanged), unknown columns, missing required columns/values, duplicate keys, and a rough time estimate (runs are paced at ~1 request/second). Always run this and review it before bulk_execute. Provide the CSV as csv_content (inline) or csv_path (a readable file path). |
| bulk_executeA | Execute a bulk create/update by launching a detached background worker that paces calls at ~1 request/second (LACRM's agreement). Returns a run_id immediately. SAFETY: this performs LIVE writes. It re-validates first and refuses to run if validation fails. You must pass confirm=true to proceed (omitting it returns the validation only). Always show the user a bulk_validate_csv preview and obtain explicit approval before passing confirm=true. ASYNC COMPLETION (optional): pass channel + requestor_email + identifier (and request_summary) and the finished result - including the report delivered as an editable Google Sheet - is posted back on the originating channel automatically when the run completes; no polling needed. Without them, poll bulk_run_status as before. Update mode uses per-field merge strategies (see fields[].strategy); an absent column is left unchanged. Provide the CSV as csv_content or csv_path. |
| bulk_run_statusA | Get the status of a bulk run started by bulk_execute. Returns progress (processed/total), success/failure counts, per-row errors, and the path to the final report CSV when complete. |
| bulk_run_resumeA | Continue a bulk run whose worker stopped before finishing (host restart, killed process). Progress is persisted after every row, so the run resumes at the first unprocessed row and rows that were already applied are never applied again. Refuses if the run is already finished or still actively running. |
| create_eventA | Create a calendar event in Less Annoying CRM. Use this tool to schedule meetings, calls, or other time-specific activities. Events can be attached to contacts and assigned to specific calendars. Required: name, start_date, end_date. Use get_calendars to find valid calendar IDs. Use get_users to find valid user IDs for attendees. Supports recurring events with RFC 5545 recurrence rules (e.g., "FREQ=WEEKLY;BYDAY=MO,WE,FR"). |
| edit_eventA | Update an existing calendar event in Less Annoying CRM. Only include fields you want to change - other fields remain unchanged. Required: event_id. Use search_events or get_event to find valid event IDs. |
| delete_eventA | Delete a calendar event from Less Annoying CRM. WARNING: This permanently removes the event from all attendee calendars. Required: event_id. |
| get_eventA | Retrieve a single calendar event by ID. Use this when you already have an EventId and need the record. NOTE: search_events returns the same full data for each match. Only use get_event when you have an ID but not the data. |
| search_eventsA | Search for calendar events within a date range. Use this tool to find events by date, user, calendar, or contact. RETURNS FULL DATA: Each result includes all event fields (name, dates, location, attendees, recurrence, etc.) - no need to call get_event afterward. Supports filtering by:
Use count_only=true for accurate counts on large datasets without returning the full result set. |
| get_events_attached_to_contactA | Retrieve all calendar events for a specific contact. RETURNS FULL DATA: Each result includes all event fields - no need to call get_event afterward. Use count_only=true for accurate counts without returning the full result set. |
| create_taskA | Create a new task in Less Annoying CRM. Tasks are reminders that appear on user task lists and daily agenda emails. Unlike events, tasks are date-only (no time component). Required: name. Optional: due_date, assigned_to, contact_id for linking to a contact. Use get_users to find valid user IDs for assigned_to. Use get_calendars to find valid calendar IDs. |
| edit_taskA | Update an existing task in Less Annoying CRM. Use this tool to modify task details or mark tasks as complete. Only include fields you want to change. Required: task_id. Use is_complete=true to mark a task as done (preferred over deleting). Pass contact_id=null to detach from a contact. |
| delete_taskA | Permanently delete a task from Less Annoying CRM. WARNING: Consider using edit_task with is_complete=true instead to preserve history. Required: task_id. |
| get_taskA | Retrieve a single task by ID. Use this when you already have a TaskId and need the record. NOTE: search_tasks returns the same full data for each match. Only use get_task when you have an ID but not the data. |
| search_tasksA | Search for tasks within a date range. Use this tool to find tasks by date, user, contact, or completion status. RETURNS FULL DATA: Each result includes all task fields (name, due date, description, completion status, linked contact, etc.) - no need to call get_task afterward. Required: start_date, end_date. Supports filtering by completion status (Both, Incomplete, Complete). Supports name-based user filter: use user_name_filter instead of user_filter. Use count_only=true for accurate counts on large datasets without returning the full result set. |
| get_tasks_attached_to_contactA | Retrieve all tasks for a specific contact. RETURNS FULL DATA: Each result includes all task fields - no need to call get_task afterward. Use count_only=true for accurate counts without returning the full result set. |
| create_noteA | Create a new note attached to a contact in Less Annoying CRM. Notes are timestamped text entries that appear in contact history. Required: contact_id, note. The note text preserves newlines but escapes HTML/markdown. |
| edit_noteA | Update an existing note in Less Annoying CRM. Only include fields you want to change. Required: note_id. Note content is completely replaced when updated. |
| delete_noteA | Delete a note from a contact's profile in Less Annoying CRM. WARNING: This permanently removes the note. Required: note_id. |
| get_noteA | Retrieve a single note by ID. Use this when you already have a NoteId and need the record. NOTE: search_notes returns the same full data for each match. Only use get_note when you have an ID but not the data. |
| search_notesA | Search for notes with optional date and user filters. Use this tool to find notes across all contacts or for specific users. RETURNS FULL DATA: Each result includes all note fields (content, timestamps, linked contact, etc.) - no need to call get_note afterward. Supports filtering by date range, user, and specific contact. Use count_only=true for accurate counts on large datasets without returning the full result set. |
| get_notes_attached_to_contactA | Retrieve all notes for a specific contact. RETURNS FULL DATA: Each result includes all note fields - no need to call get_note afterward. Use count_only=true for accurate counts without returning the full result set. |
| create_pipeline_itemA | Create a new pipeline item attached to a contact in Less Annoying CRM. PREREQUISITES (call these first):
Pipeline items track contacts through sales stages or workflows. Optionally run status automation when creating (e.g., send emails, create tasks). Supports name-based resolution: use status_name instead of status_id, and custom_field_names instead of custom_fields. |
| edit_pipeline_itemA | Update an existing pipeline item in Less Annoying CRM. PREREQUISITES (call these first):
Use this to change status, add notes, or update custom field values. Supports name-based resolution: use status_name instead of status_id, and custom_field_names instead of custom_fields. |
| delete_pipeline_itemA | Delete a single pipeline item from Less Annoying CRM. WARNING: This permanently removes the item. Required: pipeline_item_id. |
| delete_pipeline_items_bulkA | Delete multiple pipeline items at once from Less Annoying CRM. All items must belong to the same pipeline. Maximum 5000 items per call. Returns count of processed and skipped items. |
| get_pipeline_itemA | Retrieve a single pipeline item by ID. Use this when you already have a PipelineItemId and need the record. NOTE: search_pipeline_items returns the same full data for each match. Only use get_pipeline_item when you have an ID but not the data. |
| search_pipeline_itemsA | Search for pipeline items within a specific pipeline. Use this to find items by status, user, or custom field values. RETURNS FULL DATA: Each result includes all pipeline item fields (status, contact info, custom fields, timestamps, etc.) - no need to call get_pipeline_item afterward. Required: pipeline_id (use get_pipelines to find valid IDs). Supports advanced filters for custom fields. Supports name-based filters: use status_name_filter or user_name_filter instead of IDs. Use count_only=true for accurate counts on large datasets without returning the full result set. |
| get_pipeline_items_attached_to_contactA | Retrieve all pipeline items for a specific contact. RETURNS FULL DATA: Each result includes all pipeline item fields - no need to call get_pipeline_item afterward. Returns items across all pipelines that the contact is in. Use count_only=true for accurate counts without returning the full result set. |
| create_emailA | Log an email in Less Annoying CRM. Use this to record email correspondence with contacts for tracking purposes. Required: contact_ids, from, to, body, date. The email is attached to the specified contacts' history. |
| get_emailA | Retrieve a single logged email by ID. Use this when you already have an EmailId and need the record. NOTE: search_emails returns the same full data for each match. Only use get_email when you have an ID but not the data. |
| search_emailsA | Search for logged emails with optional filters. Use this to find emails by date range, user, or contact. RETURNS FULL DATA: Each result includes all email fields (sender, recipients, subject, body, timestamps, etc.) - no need to call get_email afterward. Use count_only=true for accurate counts on large datasets without returning the full result set. |
| get_emails_attached_to_contactA | Retrieve all logged emails for a specific contact. RETURNS FULL DATA: Each result includes all email fields - no need to call get_email afterward. Use count_only=true for accurate counts without returning the full result set. |
| delete_emailA | Delete a logged email from a contact's profile. WARNING: This permanently removes the email record. |
| create_fileA | Upload a file and attach it to a contact in Less Annoying CRM. Supports two input methods:
Required: contact_id, and either file_base64 or file_path. Maximum file size: 50MB. |
| get_fileA | Retrieve file information and a temporary download URL. NOTE: The download URL expires after 5 minutes. Call this again if you need a fresh URL. Returns file metadata including name, size, type, and download link. |
| get_files_attached_to_contactA | Retrieve all files attached to a specific contact. Optionally include previous file versions. NOTE: Does not include files attached via File Link custom fields. |
| create_relationshipA | Create a relationship between two contacts or companies. Relationships are bi-directional and visible on both contact records. Use the note field to describe the relationship type (e.g., "Spouse", "Referred by"). |
| edit_relationshipA | Update the note on an existing relationship. The note describes the nature of the relationship between contacts. |
| delete_relationshipA | Delete a relationship between two contacts. WARNING: This permanently removes the relationship from both contact records. |
| get_relationshipA | Retrieve details about a specific relationship. Returns both contact IDs, the note, and metadata about both contacts. |
| get_relationships_attached_to_contactA | Retrieve all relationships for a specific contact. Returns all contacts linked to this contact with their relationship notes. |
| add_contact_to_groupA | Add a contact to a group in Less Annoying CRM. Use either group_id or group_name to identify the group (not both). Use get_groups to find valid group IDs. |
| remove_contact_from_groupA | Remove a contact from a group in Less Annoying CRM. Use either group_id or group_name to identify the group (not both). |
| get_groups_for_contactB | Retrieve all groups a contact belongs to. |
| get_contacts_in_groupA | Retrieve all contacts that belong to a specific group. Use either group_id or group_name to identify the group (not both). Use count_only=true for accurate counts without returning the full result set. |
| create_custom_fieldA | Create a new custom field definition in Less Annoying CRM. Use this to add new fields for contacts, companies, or pipelines. Field types: Currency, Date, Dropdown, RadioList, Checkbox, Number, Text, TextArea, ContactLink, FileLink, Signature, Section, SectionHeader, TextBlock. For Dropdown/RadioList/Checkbox fields, provide options array. For Pipeline fields, pipeline_id is required. |
| edit_custom_fieldA | Update an existing custom field definition. Use get_custom_fields to find field IDs first. Note: You cannot change the field type after creation. |
| delete_custom_fieldA | Delete a custom field definition. WARNING: This permanently removes the field and all data stored in it across all records. |
| get_custom_fieldA | Get detailed information about a single custom field definition. Returns field name, type, options, display settings, and archived status. |
| create_groupA | Create a new group in Less Annoying CRM. Groups are used to segment contacts for easy retrieval. Sharing options:
|
| edit_groupA | Update an existing group's properties. Use get_groups to find group IDs first. |
| delete_groupA | Delete a group from the account. WARNING: This removes the group but does not delete the contacts in it. |
| get_groupA | Get details for a single group. Returns group name, sharing settings, team IDs, and color. Does not include contact membership data - use get_contacts_in_group for that. |
| create_pipelineA | Create a new pipeline in Less Annoying CRM. Pipelines track deals, opportunities, or any workflow with stages. Permissions:
|
| edit_pipelineA | Update an existing pipeline's configuration. Use get_pipelines to find pipeline IDs first. |
| delete_pipelineA | Delete a pipeline from the account. WARNING: This permanently removes the pipeline configuration. Pipeline items may become orphaned. |
| get_pipelineA | Get detailed information about a single pipeline configuration. Returns pipeline name, icon, statuses, permissions, and sharing settings. Does not return pipeline items - use search_pipeline_items for that. |
| create_pipeline_statusA | Create a new status for an existing pipeline. Statuses represent stages in your pipeline workflow. is_active:
Colors: Blue, LightBlue, Cyan, Teal, Green, LimeGreen, Yellow, Orange, Red, Pink, Magenta, Purple, Indigo, Gray, or hex codes like #486581 |
| edit_pipeline_statusA | Update an existing pipeline status. This modifies the status definition, not individual pipeline items. Only include fields you want to change. Use get_pipeline_statuses to find status IDs. |
| delete_pipeline_statusB | Delete a pipeline status. WARNING: Pipeline items using this status may become orphaned. |
| get_pipeline_statusesA | Get all statuses for a specific pipeline or all pipelines. Returns status IDs, names, active/closed state, colors, and creation dates. |
| create_teamA | Create a new team in Less Annoying CRM. Teams organize users for permission management. Use get_users first to find user IDs for team membership. |
| edit_teamA | Update a team's name and/or membership. Use get_teams to find team IDs first. Note: Passing user_ids completely replaces team membership. Pass empty array to remove all users. |
| delete_teamA | Delete a team from the account. Only account owners and administrators can delete teams. WARNING: This removes the team but does not affect the users in it. |
| get_teamA | Get detailed information about a single team. Returns team name, creation date, and member user IDs. |
| get_teamsA | Get all teams accessible to the current user. Admins see all account teams; regular users only see teams they belong to. |
| create_webhookA | Create a new webhook in Less Annoying CRM. Webhooks send POST requests to your URL when events occur. Requirements:
Scope:
Common events: Contact.Create, Contact.Edit, Contact.Delete, PipelineItemStatus.Create, PipelineItemStatus.Edit |
| get_webhookA | Get detailed information about a single webhook. Returns endpoint URL, last send date, subscribed events, and archive status. |
| get_webhooksA | Get all webhooks on the account. Optionally include archived webhooks. |
| delete_webhookA | Delete a webhook from the account. The webhook will stop sending events immediately. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| workflow_overview | START HERE: Overview of LACRM MCP workflows - explains what tools to call before any operation |
| workflow_contacts | Detailed workflow for creating and editing contacts and companies |
| workflow_pipeline_items | Detailed workflow for creating and editing pipeline items (deals/opportunities) |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/optimize-overseas/lacrm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server