Skip to main content
Glama
K02D

MCP Tabular Data Analysis Server

by K02D
README.md
# MCP Tabular Data Analysis Server

A Model Context Protocol (MCP) server that provides tools for analyzing numeric and tabular data. Works with CSV files and SQLite databases.

## Demo

### auto_insights 
<img width="656" height="815" alt="image" src="https://github.com/user-attachments/assets/5555e251-55b8-464e-9c92-91f9059a5d0f" />

### data_quality_report
<img width="854" height="856" alt="image" src="https://github.com/user-attachments/assets/bb7fcc7f-35a6-4fb2-8b35-5eafd6ce782b" />


### analyze_time_series
<img width="600" height="873" alt="image" src="https://github.com/user-attachments/assets/3e5a3c75-0f8d-4f6e-b745-a1e4b33cf809" />


## Features

### Core Tools

| Tool | Description |
|------|-------------|
| `list_data_files` | List available CSV and SQLite files in the data directory |
| `describe_dataset` | Generate statistics for a dataset (shape, types, distributions, missing values) |
| `detect_anomalies` | Find outliers using Z-score or IQR methods |
| `compute_correlation` | Calculate correlation matrices between numeric columns |
| `filter_rows` | Filter data using various operators (eq, gt, lt, contains, etc.) |
| `group_aggregate` | Group data and compute aggregations (sum, mean, count, etc.) |
| `query_sqlite` | Execute SQL queries on SQLite databases |
| `list_tables` | List all tables and schemas in a SQLite database |

### Analytics Tools

| Tool | Description |
|------|-------------|
| `create_pivot_table` | Create Excel-style pivot tables with flexible aggregations |
| `data_quality_report` | Data quality assessment with scores and recommendations |
| `analyze_time_series` | Time series analysis with trends, seasonality, and moving averages |
| `generate_chart` | Create visualizations (bar, line, scatter, histogram, pie, box plots) |
| `merge_datasets` | Join/merge two datasets together (inner, left, right, outer joins) |
| `statistical_test` | Hypothesis testing (t-test, ANOVA, chi-squared, correlation tests) |
| `auto_insights` | Discover patterns and insights |
| `export_data` | Export filtered/transformed data to new CSV files |

## Installation

### Prerequisites

- Python 3.10+
- [uv](https://docs.astral.sh/uv/) (recommended) or pip

### Install with uv

```bash
cd mcp-tabular
uv sync
```

### Install with pip

```bash
cd mcp-tabular
pip install -e .
```

## Usage

### Running the Server Directly

```bash
# With uv
uv run mcp-tabular

# With pip installation
mcp-tabular
```

### Configure with Claude Desktop

1. Locate your Claude Desktop config file:
   - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
   - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
   - **Linux**: `~/.config/Claude/claude_desktop_config.json`

2. Add this configuration (replace `/Users/kirondeb/mcp-tabular` with your actual path):

```json
{
  "mcpServers": {
    "tabular-data": {
      "command": "/Users/kirondeb/mcp-tabular/.venv/bin/python",
      "args": [
        "-m",
        "mcp_tabular.server"
      ]
    }
  }
}
```

3. Restart Claude Desktop (quit and reopen)

4. Test by asking Claude: "Describe the dataset in data/sample_sales.csv"

See [CONNECT_TO_CLAUDE_DESKTOP.md](CONNECT_TO_CLAUDE_DESKTOP.md) for detailed instructions and troubleshooting.

See [TEST_PROMPTS.md](TEST_PROMPTS.md) for example prompts.

### Sample Data

The project includes sample data for testing:

- `data/sample_sales.csv` - Sales transaction data
- `data/sample.db` - SQLite database with customers, orders, and products tables

To create the SQLite sample database:

```bash
python scripts/create_sample_db.py
```

## Path Resolution

All file paths are resolved relative to the project root directory:
- Relative paths like `data/sample_sales.csv` work from any working directory
- Absolute paths also work as expected
- Paths resolve relative to where `mcp_tabular` is installed

## Tool Examples

### List Data Files

List available data files:

```
list_data_files()
```

Lists all CSV and SQLite files in the data directory with metadata.

### Describe Dataset

Generate statistics for a dataset:

```
describe_dataset(file_path="data/sample_sales.csv")
```

Includes shape, column types, numeric statistics (mean, std, median, skew, kurtosis), categorical value counts, and a sample preview.

### Detect Anomalies

Find outliers in numeric columns:

```
detect_anomalies(
    file_path="data/sample_sales.csv",
    column="total_sales",
    method="zscore",
    threshold=3.0
)
```

Supports `zscore` and `iqr` methods.

### Compute Correlation

Calculate correlations between numeric columns:

```
compute_correlation(
    file_path="data/sample_sales.csv",
    method="pearson"
)
```

Includes full correlation matrix and top correlations ranked by strength.

### Filter Rows

Filter data based on conditions:

```
filter_rows(
    file_path="data/sample_sales.csv",
    column="category",
    operator="eq",
    value="Electronics"
)
```

Operators: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `contains`, `startswith`, `endswith`

### Group & Aggregate

Group data and compute aggregations:

```
group_aggregate(
    file_path="data/sample_sales.csv",
    group_by=["category", "region"],
    aggregations={"total_sales": ["sum", "mean"], "quantity": ["count"]}
)
```

### Query SQLite

Execute SQL queries on databases:

```
query_sqlite(
    db_path="data/sample.db",
    query="SELECT * FROM customers WHERE lifetime_value > 1000"
)
```

### List Tables

List tables and schemas in a SQLite database:

```
list_tables(db_path="data/sample.db")
```

## Advanced Analytics Examples

### Create Pivot Table

Create Excel-style pivot tables:

```
create_pivot_table(
    file_path="data/sample_sales.csv",
    index=["region"],
    columns=["category"],
    values="total_sales",
    aggfunc="sum"
)
```

### Data Quality Report

Generate a data quality assessment:

```
data_quality_report(file_path="data/sample_sales.csv")
```

Includes completeness score, duplicate detection, outlier analysis, and an overall quality grade (A-F).

### Time Series Analysis

Analyze trends and seasonality:

```
analyze_time_series(
    file_path="data/sample_sales.csv",
    date_column="order_date",
    value_column="total_sales",
    freq="M",
    include_forecast=True
)
```

### Generate Charts

Create visualizations (returned as base64 images):

```
generate_chart(
    file_path="data/sample_sales.csv",
    chart_type="bar",
    x_column="category",
    y_column="total_sales",
    title="Sales by Category"
)
```

Supported chart types: `bar`, `line`, `scatter`, `histogram`, `pie`, `box`

### Merge Datasets

Join or merge two datasets:

```
merge_datasets(
    file_path_left="data/orders.csv",
    file_path_right="data/customers.csv",
    on=["customer_id"],
    how="left"
)
```

### Statistical Testing

Run hypothesis tests:

```
statistical_test(
    file_path="data/sample_sales.csv",
    test_type="ttest_ind",
    column1="total_sales",
    group_column="region",
    alpha=0.05
)
```

Supported tests: `ttest_ind`, `ttest_paired`, `chi_squared`, `anova`, `mann_whitney`, `pearson`, `spearman`

### Auto Insights

Discover patterns and insights:

```
auto_insights(file_path="data/sample_sales.csv")
```

Includes insights about correlations, outliers, skewed distributions, missing data, and more.

### Export Data

Export filtered data to a new CSV:

```
export_data(
    file_path="data/sample_sales.csv",
    output_name="electronics_sales",
    filter_column="category",
    filter_operator="eq",
    filter_value="Electronics",
    sort_by="total_sales",
    sort_ascending=False
)
```

## Development

### Run Tests

```bash
uv run pytest
```

### Project Structure

```
mcp-tabular/
├── src/
│   └── mcp_tabular/
│       ├── __init__.py
│       └── server.py      # Main MCP server implementation
├── data/
│   ├── sample_sales.csv   # Sample CSV data
│   └── sample.db          # Sample SQLite database
├── scripts/
│   └── create_sample_db.py
├── pyproject.toml
├── claude_desktop_config.json
└── README.md
```

## License

MIT

TDQS

A3.8/5.0

Scored across 16 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between compute_correlation and statistical_test (which includes correlation tests) and between filter_rows and export_data (which includes filtering). The descriptions help clarify differences, but an agent might occasionally misselect between these pairs.

Naming Consistency5/5

All tool names follow a consistent verb_noun or verb_adjective_noun pattern in snake_case, such as analyze_time_series, create_pivot_table, and detect_anomalies. There are no deviations in naming conventions, making the set highly predictable and readable.

Tool Count4/5

With 16 tools, the count is slightly high but reasonable for a comprehensive tabular data analysis server. It covers a wide range of operations without feeling excessively bloated, though it borders on the upper limit of typical scope.

Completeness5/5

The tool set provides complete coverage for tabular data analysis, including data loading (list_data_files, list_tables), exploration (describe_dataset, auto_insights), transformation (filter_rows, merge_datasets), analysis (statistical_test, analyze_time_series), visualization (generate_chart), and export (export_data). No obvious gaps exist for the domain.