MCP server for comprehensive business analytics including email and spreadsheet analysis
The server provides 11 tools with generally adequate naming and parameter schemas, but suffers from significant gaps in description quality, output schema documentation, and error handling. Tool names follow verb_noun conventions (analyze_*, extract_*, filter_*, aggregate_*), which is good. However, descriptions lack specificity about return structures, error conditions, and when to use each tool vs. similar alternatives. Parameter descriptions are present but often generic (e.g., 'List of row dictionaries from spreadsheet' repeated across 6 tools). No visible error handling or recovery guidance. Output schemas are not documented, tools return Dict[str, Any] or List[Dict[str, Any]] with no indication of what fields clients should expect. This forces LLMs to guess at response structure and breaks tool chaining. The spreadsheet tools (validate_spreadsheet through aggregate_spreadsheet_data) are particularly repetitive, suggesting they could be composed into fewer, more specialized tools. Security is adequate (no secrets in params), but permission gates and audit trails are absent.
Aggregate spreadsheet data by grouping and performing operations.
Comprehensive analysis of a business email including sender, recipients, and content analysis.
Analyze email content for tone, urgency, key topics, and action items.
Process an .eml file and run comprehensive email analysis.
Perform statistical analysis on numeric column data.
Detect patterns and trends in column data.
Extract and analyze recipient information.
Output schemas not documented. All tools return Dict[str, Any] or List[Dict[str, Any]] with no description of field names, types, or structure. LLMs cannot plan multi-step operations or extract chaining IDs (e.g., what does analyze_business_email return? What fields exist?). This breaks tool composition and forces exploratory calls.
Generic parameter descriptions repeated across multiple tools. Six spreadsheet tools share 'List of row dictionaries from spreadsheet' without clarifying expected structure (field names, types, nullable fields, required columns). A description like 'Array of objects where each object represents a row. Row must have the specified column as a key.' would be clearer.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Extract and analyze sender information.
Filter spreadsheet data based on column criteria.
Check if the MCP server is running and responsive.
Validate and analyze spreadsheet structure and quality.
No error handling or recovery guidance. Tools like filter_spreadsheet_data accept operator enums ('=', '!=', '>', '<', '>=', '<=', 'contains') but there is no error message if an invalid operator is passed, or if the column doesn't exist, or if the value type doesn't match the column. LLMs receive no guidance on what went wrong or how to retry.
Spreadsheet tools lack pagination or result limiting. analyze_numeric_data, detect_column_patterns, and aggregate_spreadsheet_data can process unbounded data. No mention of max rows, timeout behavior, or how to handle large datasets. If an LLM passes a 1M-row spreadsheet, the tool silently consumes memory or hangs.
Multiple overlapping tools suggest tool composition issues. extract_sender_details, extract_recipients_details, analyze_email_body, and analyze_business_email all analyze email data but with different interfaces. An agent cannot easily chain them or understand which to call. Consider whether a single 'analyze_email' with optional depth/scope parameters would be clearer.
Parameter 'operator' in filter_spreadsheet_data is a free-form string. Although the description lists valid operators, there is no enum constraint in the schema. LLMs will guess operators like 'between', 'in', 'regex', etc. that don't exist, causing silent failures or invalid comparisons.
Parameter 'operation' in aggregate_spreadsheet_data is also a free-form string without enum. Valid operations are 'sum', 'avg', 'count', 'min', 'max', but LLMs may try 'average', 'total', 'mean', 'median', 'mode' without constraint validation.