MCP server for analyzing telco customer churn data, providing dataset exploration, statistical analysis, visualization, dynamic querying, and machine learning-based churn prediction
The server provides 6 tools with reasonable descriptions and clear names. However, there are significant gaps in schema completeness, parameter descriptions, and error handling guidance. The server lacks input validation details, enum constraints for multi-valued parameters, and actionable error recovery guidance. Most tools have functional descriptions but fall short of LLM-optimized clarity. The predict_churn tool has an exceptionally detailed parameter list (19 params) but lacks enum constraints for the many yes/no and categorical fields, inviting hallucinated values. Several tools return raw strings instead of structured output, which wastes tokens and complicates downstream parsing.
Calculates Pearson correlation between numerical columns and returns a heatmap. Useful for understanding which features are related to each other and to churn.
Returns the column names, data types, and non-null counts.
Calculates mean, median, min, max, and std dev for a numeric column.
Generates a plot for a column and returns the image directly to the AI. For categorical columns, creates a horizontal bar chart. For numeric columns, creates a histogram with KDE.
Predicts the probability of a customer churning based on their attributes. Parameters: - gender: 'Male' or 'Female' - senior_citizen: 'Yes' or 'No' - partner: 'Yes' or 'No' - dependents: 'Yes' or 'No' - tenure: Number of months as customer (0-72) - phone_service: 'Yes' or 'No' - multiple_lines: 'Yes' or 'No' - internet_service: 'DSL', 'Fiber optic', or 'No' - online_security: 'Yes' or 'No' - online_backup: 'Yes' or 'No' - device_protection: 'Yes' or 'No' - tech_support: 'Yes' or 'No' - streaming_tv: 'Yes' or 'No' - streaming_movies: 'Yes' or 'No' - contract: 'Month-to-month', 'One year', or 'Two year' - paperless_billing: 'Yes' or 'No' - payment_method: 'Electronic check', 'Mailed check', 'Bank transfer (automatic)', or 'Credit card (automatic)' - monthly_charges: Monthly payment amount - total_charges: Total amount paid to date Returns churn probability, risk level, and recommendation.
Categorical parameters lack enum constraints. Many parameters accept only known values (gender: Male/Female, contract: Month-to-month/One year/Two year, internet_service: DSL/Fiber optic/No) but are defined as free-form strings in schema.
Example values in descriptions invite literal reuse. The run_pandas_query description includes examples like 'SeniorCitizen == "Yes"' which LLMs tend to copy literally into new queries, causing data leakage and errors.
Tools return unstructured strings instead of structured JSON. get_summary_stats returns df.describe().to_string(), run_pandas_query returns raw dataframe rows as text, predict_churn returns multi-line text with probability embedded as prose.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 41 | - | v1 |
Allows dynamic filtering of the telco dataframe using pandas query syntax. Example queries: - "SeniorCitizen == 'Yes' and MonthlyCharges > 70" - "Contract == 'Month-to-month'" - "Churn == 1 and tenure < 12" Returns a summary and the first 10 matching rows.
No output schema documentation. Tool descriptions mention what they return (e.g., 'returns a heatmap', 'returns a summary and the first 10 matching rows') but the MCP server does not declare the response schema formally.
No pagination or result limits documented. run_pandas_query returns 'the first 10 matching rows' but doesn't expose a limit/offset parameter or total count. get_dataset_info returns raw df.info() which could be very large for wide datasets.
Error handling lacks actionable recovery guidance for LLMs. Code catches exceptions and returns generic error strings, but descriptions do not explain what the LLM should try next.
predict_churn has excessive required parameters (19) with no optional fallback or lookup. If an LLM lacks a field value, it must fail the entire call.
No permission declarations or scope annotations. Tools can read and analyze customer data without any declared permissions or audit logging.