An MCP server that exposes CRM business logic tools for customer management, including customer search, churn risk analysis, high-value customer identification, email generation, and action logging.
17 tools with mostly complete schemas and descriptions, but significant gaps in error handling, parameter validation, and output documentation. Tool names follow verb_noun convention well (get_, find_, search_, update_, add_, send_). Descriptions average ~120 chars, meeting baseline minimums but lacking LLM-optimized guidance on WHEN to use each tool vs. similar ones. No tool annotations (readOnlyHint/destructiveHint). Output schemas not documented. Many parameters lack constraints (enums, ranges). Error recovery guidance absent. Composition is reasonable but search_customers and find_customer_by_name overlap significantly.
Add or update the notes field for a specific customer. Saves permanently to the database.
Find all customers flagged as churn risk. These are urgent accounts that may cancel soon.
Find a customer by their name. Supports partial and case-insensitive matching.
Find all high-value customers whose total spend exceeds min_spend dollars. Default is $10,000.
Find customers who have not been active for more than threshold_days days. Default is 60 days.
Generate a personalised follow-up email draft for a customer using AI.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). LLMs cannot distinguish safe read-only tools from destructive writes without explicit hints. send_email, update_customer_status, add_customer_note, save_action_log should be marked destructiveHint=true.
Output schemas not documented. Tools return free-text strings (e.g., get_all_customers returns formatted text, not structured JSON). LLMs cannot reliably parse unstructured output or chain results to downstream tools. Requires structured response objects with typed fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Retrieve the CRM action log. Optionally filter by customer ID.
Get a complete overview of all customers including total count and breakdown by status.
Generate a full CRM executive summary with customer counts, revenue at risk, top 3 urgent accounts, and quick wins.
Get the complete profile for a specific customer using their ID like C001 or C003.
Generate a breakdown of customers and revenue by industry, including churn risk count per industry.
Run a read-only SQL SELECT query directly on the CRM database. Use this for complex analytical queries the standard tools cannot answer. Only SELECT statements are allowed.
Save a note or action taken for a customer to the CRM action log.
Search customers by any combination of fields. Supports: name, email, status (active/inactive/churn_risk), plan (basic/pro/enterprise), industry, min_spend, max_spend, min_active_days, max_active_days.
Send an actual email via Gmail to a customer. Always confirm with user before sending.
Suggest the best next action for a specific customer based on their activity and status.
Update a customer's status in the CRM. Valid statuses: active, inactive, churn_risk. Saves permanently to the database.
Enum constraints missing. Parameters like 'status' (active/inactive/churn_risk), 'plan' (basic/pro/enterprise), and 'new_status' accept free-form strings. LLMs hallucinate invalid values. Add JSON Schema enum constraints.
No error recovery guidance. Tools return bare error messages ('No customer found with ID: X') without suggesting next steps. Should guide LLM: 'No customer found with ID: X. Try search_customers() or find_customer_by_name().'
Overlapping tool responsibilities. search_customers and find_customer_by_name both search by name; find_inactive_customers, find_churn_risk_customers, find_high_value_customers are specialized filters. LLM wastes reasoning cycles deciding which to call. Consider consolidating into search_customers with filter parameters.