MaidCentral MCP by usefulapi

Read services, prices and open dates; create leads, quotes, bookings and notes in MaidCentral.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
72%
Naming quality
74%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (6)

  • LOWTool 'maidcentral_list_scope_frequencies' name length outside 3-30 rangein maidcentral_list_scope_frequencies
  • LOWTool 'maidcentral_list_rate_modifications' name length outside 3-30 rangein maidcentral_list_rate_modifications
  • LOWTool 'maidcentral_list_available_dates' name length outside 3-30 rangein maidcentral_list_available_dates
  • LOWTool 'maidcentral_list_customer_sources' name length outside 3-30 rangein maidcentral_list_customer_sources
  • LOWTool 'maidcentral_create_or_update_lead' name length outside 3-30 rangein maidcentral_create_or_update_lead
  • LOWTool 'maidcentral_create_or_update_quote' name length outside 3-30 rangein maidcentral_create_or_update_quote

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,376Tokens (tool definitions)
~1.8 KBTypical response size
Significant attention impact (3.42% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "maidcentral": {
      "url": "https://maidcentral.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://maidcentral.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢maidcentral_list_scope_groups

List service categories (scope groups) with their scopes of work and frequency ids. Start here: the ids feed quotes, pricing and bookings. API: GET /api/Lead/ScopeGroups.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_scopes(scope_group_id)

List the scopes of work (and frequencies) of one scope group. API: GET /api/Lead/Scopes.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Scope group id."
    }
  },
  "required": [
    "scope_group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_scope_frequencies(scope_id)

List the frequency options (one-time, weekly, ...) of one scope. API: GET /api/Lead/ScopeFrequencies.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Scope id."
    }
  },
  "required": [
    "scope_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_questions(scope_ids)

List the questions (home size, bedrooms, ...) and answer options for one or more scopes. Required questions must be answered in quotes and pricing. API: GET /api/Lead/Questions.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_ids": {
      "minItems": 1,
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
      },
      "description": "Scope ids."
    }
  },
  "required": [
    "scope_ids"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_rate_modifications(scope_group_id)

List the extras, discounts and other rate modifications available for a scope group. API: GET /api/Lead/RateModifications.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Scope group id."
    }
  },
  "required": [
    "scope_group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_available_dates(scope_group_id, hours, amount, start_date, end_date)

List dates on which a quoted job of a given length or price can be booked for a scope group. Give hours or amount. API: GET /api/Lead/Availability.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Scope group id."
    },
    "hours": {
      "description": "Job length in hours (hours or amount is required).",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "amount": {
      "description": "Job amount (hours or amount is required).",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "start_date": {
      "description": "Start date, ISO 8601. Default today.",
      "type": "string"
    },
    "end_date": {
      "description": "End date, ISO 8601. Default one month from today.",
      "type": "string"
    }
  },
  "required": [
    "scope_group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_postal_codes

List the postal codes the company serves, with their home zone. API: GET /api/Lead/PostalCodes.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_customer_sources

List customer (lead) sources. API: GET /api/Lead/CustomerSources.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_billing_terms

List billing terms usable when booking. API: GET /api/Lead/BillingTerms.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_teams

List teams that jobs can be scheduled to. API: GET /api/Lead/Teams.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_tags

List tags with their category ids (lead tags = category 8, service set tags = 5, first job tags = 6). API: GET /api/Lead/Tags.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_list_note_types

List note types (Email = 1, Note = 2, PhoneCall = 3, TextMessage = 4). API: GET /api/Note/Types.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_get_lead(lead_id)

Get a lead by id: contact details, status, source, scope group and addresses. API: GET /api/Lead/Lead.

Input Schema

{
  "type": "object",
  "properties": {
    "lead_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Lead id."
    }
  },
  "required": [
    "lead_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_get_quote(quote_id)

Get a quote by id: status, addresses, and per-scope and per-frequency prices, hours and booked state. API: GET /api/Lead/Quote.

Input Schema

{
  "type": "object",
  "properties": {
    "quote_id": {
      "type": "string",
      "pattern": "^[0-9a-fA-F-]{36}$",
      "description": "Quote id (uuid)."
    }
  },
  "required": [
    "quote_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢maidcentral_calculate_price(scope_group_id, postal_code, scopes_of_work, questions)

Calculate a price for scopes, frequencies, extras and question answers without creating a lead or quote. Stores nothing. API: POST /api/Lead/CalculatePrice.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Scope group id."
    },
    "postal_code": {
      "description": "Service postal code.",
      "type": "string"
    },
    "scopes_of_work": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ScopeOfWorkId": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Scope id (from maidcentral_list_scope_groups)."
          },
          "FrequencyId": {
            "type": "string",
            "description": "Frequency id for this scope (from maidcentral_list_scope_groups)."
          },
          "BaseFee": {
            "description": "Optional: override the calculated price for this scope/frequency.",
            "type": "number"
          },
          "RateModifications": {
            "description": "Optional extras/discounts (from maidcentral_list_rate_modifications).",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "RateModificationId": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "Quantity": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991,
                  "description": "Quantity, must not be 0."
                },
                "IsRecurring": {
                  "type": "boolean"
                }
              },
              "required": [
                "RateModificationId",
                "Quantity"
              ]
            }
          }
        },
        "required": [
          "ScopeOfWorkId",
          "FrequencyId"
        ]
      },
      "description": "Scopes and frequencies to price."
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "QuestionId": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "Answer": {
            "type": "string",
            "description": "Select lists: the AnswerId. Multiple select: comma-separated AnswerIds. Else plain text."
          }
        },
        "required": [
          "QuestionId",
          "Answer"
        ]
      },
      "description": "Answers to the scope questions (use [] if none)."
    }
  },
  "required": [
    "scope_group_id",
    "scopes_of_work",
    "questions"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴maidcentral_create_or_update_lead(first_name, last_name, email, phone, postal_code, ...)

WRITE: create a lead, or update one when lead_id is given. The postal code must be in a home zone. By default MaidCentral may send the lead email, add the lead to campaigns and trigger webhooks: set send_lead_email, add_to_campaigns and trigger_webhook to false to avoid that. Without allow_duplicates, a matching contact links to the existing lead. API: POST /api/Lead/CreateOrUpdate.

Input Schema

{
  "type": "object",
  "properties": {
    "first_name": {
      "type": "string"
    },
    "last_name": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "postal_code": {
      "type": "string",
      "description": "Must be inside the company's home zones."
    },
    "lead_id": {
      "description": "Existing lead id to update.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "notes": {
      "description": "One note to attach to the lead.",
      "type": "string"
    },
    "customer_source_id": {
      "description": "From maidcentral_list_customer_sources.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "lead_tag_ids": {
      "description": "Tag ids of category 8 (maidcentral_list_tags).",
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
      }
    },
    "send_lead_email": {
      "description": "Send the lead email (vendor default true).",
      "type": "boolean"
    },
    "add_to_campaigns": {
      "description": "Add to MaidCentral campaigns (vendor default true).",
      "type": "boolean"
    },
    "trigger_webhook": {
      "description": "Trigger Keap/Zapier webhooks (vendor default true).",
      "type": "boolean"
    },
    "allow_duplicates": {
      "description": "Create a new lead even when contact info matches (vendor default false).",
      "type": "boolean"
    },
    "utm_source": {
      "type": "string"
    },
    "utm_medium": {
      "type": "string"
    },
    "utm_campaign": {
      "type": "string"
    },
    "utm_term": {
      "type": "string"
    },
    "utm_content": {
      "type": "string"
    }
  },
  "required": [
    "first_name",
    "last_name",
    "email",
    "phone",
    "postal_code"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴maidcentral_create_or_update_quote(lead_id, quote_id, scope_group_id, home_address1, home_address2, ...)

WRITE: create a quote for a lead (or update one when quote_id is given) with service address, scopes, frequencies and question answers. Optionally emails the quote 5 minutes later (send_quote_email, default false). API: POST /api/Lead/CreateOrUpdateQuote.

Input Schema

{
  "type": "object",
  "properties": {
    "lead_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Lead id (from maidcentral_create_or_update_lead)."
    },
    "quote_id": {
      "description": "Existing quote id to update.",
      "type": "string",
      "pattern": "^[0-9a-fA-F-]{36}$"
    },
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "home_address1": {
      "type": "string"
    },
    "home_address2": {
      "type": "string"
    },
    "home_city": {
      "type": "string"
    },
    "home_region": {
      "type": "string",
      "description": "2-letter state or region code."
    },
    "home_postal_code": {
      "type": "string"
    },
    "billing_address1": {
      "description": "Optional billing address (default: the service address).",
      "type": "string"
    },
    "billing_address2": {
      "type": "string"
    },
    "billing_city": {
      "type": "string"
    },
    "billing_region": {
      "type": "string"
    },
    "billing_postal_code": {
      "type": "string"
    },
    "scopes_of_work": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ScopeOfWorkId": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Scope id (from maidcentral_list_scope_groups)."
          },
          "FrequencyId": {
            "type": "string",
            "description": "Frequency id for this scope (from maidcentral_list_scope_groups)."
          },
          "BaseFee": {
            "description": "Optional: override the calculated price for this scope/frequency.",
            "type": "number"
          },
          "RateModifications": {
            "description": "Optional extras/discounts (from maidcentral_list_rate_modifications).",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "RateModificationId": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "Quantity": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991,
                  "description": "Quantity, must not be 0."
                },
                "IsRecurring": {
                  "type": "boolean"
                }
              },
              "required": [
                "RateModificationId",
                "Quantity"
              ]
            }
          }
        },
        "required": [
          "ScopeOfWorkId",
          "FrequencyId"
        ]
      }
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "QuestionId": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "Answer": {
            "type": "string",
            "description": "Select lists: the AnswerId. Multiple select: comma-separated AnswerIds. Else plain text."
          }
        },
        "required": [
          "QuestionId",
          "Answer"
        ]
      },
      "description": "Answers to the scope questions (use [] if none)."
    },
    "send_quote_email": {
      "description": "Email the quote to the lead after 5 minutes.",
      "type": "boolean"
    },
    "add_to_campaigns": {
      "type": "boolean"
    },
    "trigger_webhook": {
      "type": "boolean"
    }
  },
  "required": [
    "lead_id",
    "scope_group_id",
    "home_address1",
    "home_city",
    "home_region",
    "home_postal_code",
    "scopes_of_work",
    "questions"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴maidcentral_book_quote(lead_id, quote_id, scope_group_id, scopes_of_work, billing_terms_id, ...)

WRITE: convert a quote into a customer and schedule the first job on first_job_date. Check dates with maidcentral_list_available_dates first. Booking emails default to the vendor setting: set send_booked_email and send_customer_portal_invite to false to stay silent. API: POST /api/Lead/BookQuote.

Input Schema

{
  "type": "object",
  "properties": {
    "lead_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "quote_id": {
      "type": "string",
      "pattern": "^[0-9a-fA-F-]{36}$"
    },
    "scope_group_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "scopes_of_work": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ScopeOfWorkId": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Scope id (from maidcentral_list_scope_groups)."
          },
          "FrequencyId": {
            "type": "string",
            "description": "Frequency id for this scope (from maidcentral_list_scope_groups)."
          },
          "BaseFee": {
            "description": "Optional: override the calculated price for this scope/frequency.",
            "type": "number"
          },
          "RateModifications": {
            "description": "Optional extras/discounts (from maidcentral_list_rate_modifications).",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "RateModificationId": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "Quantity": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991,
                  "description": "Quantity, must not be 0."
                },
                "IsRecurring": {
                  "type": "boolean"
                }
              },
              "required": [
                "RateModificationId",
                "Quantity"
              ]
            }
          },
          "FirstJobDate": {
            "type": "string",
            "description": "First job date, ISO 8601 (defaults to 9:00 AM; add a time to change it)."
          },
          "FirstJobInstructions": {
            "type": "string"
          },
          "FirstJobTagIds": {
            "description": "Tag ids of category 6.",
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          },
          "ServiceSetTagIds": {
            "description": "Tag ids of category 5.",
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          },
          "TeamIds": {
            "description": "Team ids (maidcentral_list_teams).",
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          }
        },
        "required": [
          "ScopeOfWorkId",
          "FrequencyId",
          "FirstJobDate"
        ]
      }
    },
    "billing_terms_id": {
      "description": "From maidcentral_list_billing_terms.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "send_booked_email": {
      "type": "boolean"
    },
    "send_customer_portal_invite": {
      "type": "boolean"
    },
    "add_to_campaigns": {
      "type": "boolean"
    },
    "trigger_webhook": {
      "type": "boolean"
    }
  },
  "required": [
    "lead_id",
    "quote_id",
    "scope_group_id",
    "scopes_of_work"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴maidcentral_create_note(content, entity_type_id, entity_id, entity_contact_info, note_type_id, ...)

WRITE: add a note (or logged email, call, text) to a quote, customer or employee. Give entity_id with entity_type_id, or entity_contact_info (email or phone). API: POST /api/Note/Create.

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "description": "Note text."
    },
    "entity_type_id": {
      "description": "Quote = 0, Customer = 1, Employee = 2.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2
    },
    "entity_id": {
      "description": "Id of the entity (needs entity_type_id).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "entity_contact_info": {
      "description": "Email or phone; searched in customers, leads, then employees.",
      "type": "string"
    },
    "note_type_id": {
      "description": "Email = 1, Note = 2 (default), PhoneCall = 3, TextMessage = 4.",
      "type": "integer",
      "minimum": 1,
      "maximum": 4
    },
    "subject": {
      "description": "Required unless the note type is Email.",
      "type": "string"
    },
    "create_ticket": {
      "description": "For communication notes: also create a ticket.",
      "type": "boolean"
    },
    "communication_direction_id": {
      "description": "InternalNote = 0 (default), Incoming = 1, Outgoing = 2.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2
    }
  },
  "required": [
    "content"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡maidcentral_add_utm_data(lead_id, email, phone, utm_source, utm_medium, ...)

WRITE: attach UTM campaign data to a lead or quote. Give lead_id, email or phone. API: POST /api/Lead/Utm.

Input Schema

{
  "type": "object",
  "properties": {
    "lead_id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "utm_source": {
      "type": "string"
    },
    "utm_medium": {
      "type": "string"
    },
    "utm_campaign": {
      "type": "string"
    },
    "utm_term": {
      "type": "string"
    },
    "utm_content": {
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools