Skip to main content
Glama
README.md
# Excel Analyser MCP

[![MCP Badge](https://lobehub.com/badge/mcp/contactakagrawal-excel-analyser-mcp)](https://lobehub.com/mcp/contactakagrawal-excel-analyser-mcp)
[![npm version](https://img.shields.io/npm/v/excel-analyser-mcp.svg)](https://www.npmjs.com/package/excel-analyser-mcp)
[![npm downloads](https://img.shields.io/npm/dt/excel-analyser-mcp.svg)](https://www.npmjs.com/package/excel-analyser-mcp)
[![License](https://img.shields.io/badge/license-ISC-blue.svg)](https://github.com/contactakagrawal/excel-analyser-mcp/blob/main/LICENSE)
[![MCP Server](https://img.shields.io/badge/MCP-Server-green.svg)](https://lobehub.com)

A Node.js MCP server for reading and analyzing Excel (.xlsx), CSV (.csv), and JSON (.json) files. Supports **multiple transport protocols** (stdio, HTTP, SSE) and designed for scalable, chunked, and column/field-specific data access, making it ideal for AI agents and automation workflows that need to process large datasets efficiently.

## šŸš€ Quick Start - Configuration

Excel Analyser MCP supports multiple transport protocols: **stdio** (npm/CLI), **HTTP streamable**, and **SSE**.

### ⚔ Ready-to-Use HTTP Server (Recommended)
The fastest way to get started! Use our deployed server without any installation:

**MCP Client Configuration (HTTP - Ready to Use):**
```json
{
  "mcpServers": {
    "Excel Analyser MCP": {
      "type": "http",
      "url": "https://web-production-64851.up.railway.app/mcp"
    }
  }
}
```

šŸŽ‰ **That's it!** No installation required. Start analyzing files immediately.

**šŸ“ Example Usage Prompt (HTTP - Use Cloud URLs):**
```
Please analyze the Excel file at https://github.com/contactakagrawal/excel-analyser-mcp/raw/main/tests/dummy_excel_file.xlsx and show me the first few rows and column names.
```

**āš ļø Important for HTTP:** Use **cloud URLs** (GitHub raw, Google Drive public links, etc.) since the server runs remotely and cannot access your local files.

### NPM/Stdio Transport (Self-hosted)
Perfect for MCP clients like Claude Desktop, Cursor, and other CLI-based integrations.

**mcp.json Configuration:**
```json
{
  "mcpServers": {
    "Excel Analyser MCP": {
      "command": "npx",
      "args": ["-y", "excel-analyser-mcp"]
    }
  }
}
```

**šŸ“ Example Usage Prompt (Stdio - Use Local Paths):**
```
Please analyze the Excel file at /Users/john/Documents/sales_data.xlsx and show me the first few rows and column names.
```

**āš ļø Important for Stdio:** Use **absolute local file paths** since the server runs on your machine and can access your local files directly.

### HTTP Transport (Self-hosted)
Ideal for web applications, REST API integrations, and serverless deployments.

**Start HTTP Server:**
```bash
# Default: runs on http://localhost:8080/mcp
npx excel-analyser-mcp streamableHttp

# Custom port and endpoint
npx excel-analyser-mcp streamableHttp 3000 /excel-mcp
```

**MCP Client Configuration (HTTP):**
```json
{
  "mcpServers": {
    "Excel Analyser MCP": {
      "type": "http",
      "url": "http://localhost:8080/mcp"
    }
  }
}
```

**šŸ“ Example Usage Prompt (Self-hosted HTTP - Use Local or Cloud URLs):**
```
Please analyze the Excel file at /Users/john/Documents/sales_data.xlsx and show me the first few rows and column names.
```

**āš ļø Important for Self-hosted HTTP:** You can use **local absolute paths** or **cloud URLs** since your server can access both local files and remote URLs.

### SSE Transport (Self-hosted)
For real-time streaming applications (deprecated but still supported).

**Start SSE Server:**
```bash
# Default: runs on http://localhost:8080/sse
npx excel-analyser-mcp sse

# Custom port and endpoint  
npx excel-analyser-mcp sse 3000 /excel-sse
```

**MCP Client Configuration (SSE):**
```json
{
  "mcpServers": {
    "Excel Analyser MCP": {
      "type": "sse", 
      "url": "http://localhost:8080/sse"
    }
  }
}
```

### Development Scripts (Self-hosted)
```bash
npm run start          # Default stdio transport
npm run start:stdio    # Explicit stdio transport  
npm run start:http     # HTTP transport on port 8080
npm run start:sse      # SSE transport on port 8080
```

---

## What's New in v2.1.0
- **šŸš€ Multi-Transport Support**: Now supports stdio (npm), HTTP streamable, and SSE transports for maximum flexibility
- **šŸ”— HTTP Transport**: Perfect for web applications and REST API integrations  
- **šŸ“” SSE Transport**: Real-time streaming capabilities for advanced use cases
- **āš™ļø Easy Configuration**: Simple command-line arguments to choose your preferred transport

## What's New in v2.0.0
- **New `query_json` Tool**: A powerful new tool for efficiently searching large JSON files based on field values.
- **Efficient Streaming**: All JSON tools (`read_json`, `query_json`, `get_json_chunk`) have been re-architected to use streaming. This means they can process gigabyte-sized files with minimal memory usage, preventing crashes and ensuring scalability.

## Features
- **Multi-Transport Support**: Choose between stdio (npm), HTTP streamable, or SSE transports
- **Read Excel/CSV/JSON files** and output all or selected columns/fields as JSON
- **Efficient Streaming**: Handle multi-gigabyte JSON files with constant, low memory usage.
- **Powerful JSON Querying**: Quickly search and filter large JSON files without loading the entire file into memory.
- **Chunked Access**: Process large files iteratively by fetching data in configurable chunks.
- **Column/Field filtering**: Extract only the columns or fields you need.
- **MCP server integration**: Expose tools for AI agents and automation.

## Getting Started

### Prerequisites
- Node.js (v18 or higher recommended)

### Installation
```bash
npm install
yarn install # or your preferred package manager
```

### Running the MCP Server
```bash
node excel-analyser-mcp.js
```

Or configure your MCP agent to launch this file with Node.js and --stdio.

---

## MCP Tools

### 1. `read_excel`
**Description:** Reads an Excel or CSV file and returns a preview (first 100 rows) and metadata for large files, or the full data for small files.

**Parameters:**
- `filePath` (string, required): Path to the Excel or CSV file on disk (.xlsx or .csv)
- `columns` (array of strings, optional): Columns to include in the output. If not specified, all columns are included.

**Returns:**
- For large files: `{ preview: [...], totalRows, columns, message }`
- For small files: Full data as an array

**Example Request:**
```json
{
  "filePath": "./your_data.csv",
  "columns": ["description", "category"]
}
```

---

### 2. `get_chunk`
**Description:** Fetches a chunk of rows from a CSV or Excel file, with optional column filtering. Useful for processing large files in batches.

**Parameters:**
- `filePath` (string, required): Path to the Excel or CSV file on disk (.xlsx or .csv)
- `columns` (array of strings, optional): Columns to include in the output
- `start` (integer, optional, default 0): Row index to start from (0-based)
- `limit` (integer, optional, default 1000): Number of rows to return in the chunk

**Returns:**
- `{ chunk: [...], start, limit, totalRows }`

**Example Request:**
```json
{
  "filePath": "./your_data.csv",
  "columns": ["description"],
  "start": 0,
  "limit": 1000
}
```

**Example Response:**
```json
{
  "chunk": [
    { "description": "Customer cannot login..." },
    { "description": "Payment failed for order..." }
    // ... up to 1000 rows
  ],
  "start": 0,
  "limit": 1000,
  "totalRows": 58635
}
```

---

### 3. `read_json`
**Description:** Efficiently reads a large JSON file to provide a quick preview (first 100 entries) and metadata without loading the entire file into memory. This is the recommended first step for analyzing a new JSON file.

**Parameters:**
- `filePath` (string, required): Path to the JSON file on disk (.json)
- `fields` (array of strings, optional): Fields to include in the output. If not specified, all fields are included.

**Returns:**
- For large files (>1000 entries): `{ preview: [...], totalEntries, fields, message }`
- For small files: Full data as an array

**Example Request:**
```json
{
  "filePath": "./employees.json",
  "fields": ["name", "department", "salary"]
}
```

**Example Response (large file):**
```json
{
  "JSON": {
    "preview": [
      { "name": "John Doe", "department": "Engineering", "salary": 75000 },
      { "name": "Jane Smith", "department": "Marketing", "salary": 65000 }
      // ... up to 100 entries
    ],
    "totalEntries": 15000,
    "fields": ["id", "name", "email", "age", "department", "salary"],
    "message": "Data is too large to return in one response. Use get_json_chunk for paginated access or query_json to search."
  }
}
```

---

### 4. `query_json`
**Description:** Performs a fast, memory-efficient search on a large JSON file. It streams the file and returns all entries that match the specified query, up to a limit of 1000 results. This is the ideal tool for finding specific data within a large dataset.

**Parameters:**
- `filePath` (string, required): Path to the JSON file on disk (.json).
- `query` (object, required): The query to execute on the JSON data.
  - `field` (string): The field to query (e.g., 'trading_symbol').
  - `operator` (enum): The query operator. Can be `contains`, `equals`, `startsWith`, or `endsWith`.
  - `value` (string): The value to match against.

**Returns:**
- `{ matches: [...], matchCount, totalEntriesScanned, message }`

**Example Request:**
```json
{
  "filePath": "/path/to/your/large_dataset.json",
  "query": {
    "field": "trading_symbol",
    "operator": "contains",
    "value": "TITAN"
  }
}
```

**Example Response:**
```json
{
  "matches": [
    { "instrument_key": "NSE_EQ|INE280A01028", "trading_symbol": "TITAN" },
    { "instrument_key": "NSE_EQ|INE280A01029", "trading_symbol": "TITANBEES" }
  ],
  "matchCount": 2,
  "totalEntriesScanned": 2500000,
  "message": "Query returned 2 matching entries."
}
```

---

### 5. `get_json_chunk`
**Description:** Fetches a specific chunk of entries from a JSON file. This tool is designed for **iterative analysis**, where you need to process every entry in the file sequentially, one chunk at a time. It uses efficient streaming to access the requested chunk without re-reading the whole file.

**Parameters:**
- `filePath` (string, required): Path to the JSON file on disk (.json)
- `fields` (array of strings, optional): Fields to include in the output
- `start` (integer, optional, default 0): Entry index to start from (0-based)
- `limit` (integer, optional, default 1000): Number of entries to return in the chunk

**Returns:**
- `{ chunk: [...], start, limit, totalEntries }`

**Example Request:**
```json
{
  "filePath": "./large_dataset.json",
  "fields": ["id", "name", "status"],
  "start": 0,
  "limit": 1000
}
```

**Example Response:**
```json
{
  "chunk": [
    { "id": 1, "name": "John Doe", "status": "active" },
    { "id": 2, "name": "Jane Smith", "status": "inactive" }
    // ... up to 1000 entries
  ],
  "start": 0,
  "limit": 1000,
  "totalEntries": 15000
}
```

---

## How to Choose the Right JSON Tool

Use this guide to select the most efficient tool for your task:

- **To explore a new JSON file:**
  - **1st:** Use `read_json`. It will give you the total number of entries, all available fields, and a preview of the first 100 entries.

- **To find specific data:**
  - **Use `query_json`**. It's the fastest and most memory-efficient way to search for entries that match a specific condition (e.g., find all users where `status` is `active`).

- **To process every entry:**
  - **Use `get_json_chunk`**. This is for when you need to perform an action on every single entry in the file, such as categorizing support tickets or performing a complex calculation. Call it in a loop, incrementing the `start` parameter, until you have processed all `totalEntries`.

## Usage with AI Agents
- Configure your AI agent (e.g., Cursor AI, Copilot) to connect to this MCP server.
- Use `read_excel` or `read_json` for a quick preview and metadata.
- Use `get_chunk` or `get_json_chunk` to iterate through large files in batches for scalable analysis.
- JSON files with more than 1000 entries automatically use pagination for optimal performance.

---

## Example Usage

Here's an example of how you can use this MCP server with an AI agent to analyze files.

**Important:** The MCP server requires **absolute file paths** for security and reliability reasons.

### Analyzing an Excel/CSV File

**Scenario:** You want to get a summary of `dummy_excel_file.xlsx`.

**1. Initial Request to AI Agent:**

> **You:** Can you analyze the file at `/home/john/documents/dummy_excel_file.xlsx` and give me the column names and the first few rows?

**2. AI Agent uses the `read_excel` tool:**

The agent would make a tool call similar to this:

```json
{
  "tool_name": "read_excel",
  "parameters": {
    "filePath": "/home/john/documents/dummy_excel_file.xlsx"
  }
}
```

**3. Response from the MCP Server:**

If the file is large, the server will return a preview:

```json
{
  "preview": [
    { "ID": 1, "Name": "John Doe", "Sales": 1500 },
    { "ID": 2, "Name": "Jane Smith", "Sales": 2200 }
  ],
  "totalRows": 10500,
  "columns": ["ID", "Name", "Sales"],
  "message": "File is large. Returning a preview of the first 100 rows."
}
```

### Searching a Large JSON File

**Scenario:** You want to find all stocks with "TITAN" in their trading symbol from a very large JSON file.

**1. Initial Request to AI Agent:**
> **You:** Can you find all entries in `/data/NSE.json` where the `trading_symbol` contains `TITAN`?

**2. AI Agent uses the `query_json` tool:**
```json
{
  "tool_name": "query_json",
  "parameters": {
    "filePath": "/data/NSE.json",
    "query": {
      "field": "trading_symbol",
      "operator": "contains",
      "value": "TITAN"
    }
  }
}
```

**3. Response from the MCP Server:**
```json
{
  "matches": [
    { "instrument_key": "NSE_EQ|INE280A01028", "trading_symbol": "TITAN" }
  ],
  "matchCount": 1,
  "totalEntriesScanned": 2500000,
  "message": "Query returned 1 matching entries."
}
```

### Analyzing a JSON File Iteratively

**Scenario:** You want to analyze a large JSON dataset of employee records, chunk by chunk.

**1. Initial Request to AI Agent:**

> **You:** Can you analyze the employee data in `/home/john/data/employees.json` and show me the first chunk?

**2. AI Agent uses the `get_json_chunk` tool:**

```json
{
  "tool_name": "get_json_chunk",
  "parameters": {
    "filePath": "/home/john/data/employees.json",
    "start": 0,
    "limit": 1000
  }
}
```

**3. Response for Large JSON File:**
```json
{
  "chunk": [
    { "id": 1, "name": "John Doe", "status": "active" }
  ],
  "start": 0,
  "limit": 1000,
  "totalEntries": 15000
}
```

---

## šŸš€ Cloud Deployment

Deploy your MCP server to the internet so others can use it via HTTP transport!

### Quick Deploy to Railway
1. **Fork/clone** this repository
2. **Connect to Railway**: [railway.app](https://railway.app) → New Project → Deploy from GitHub
3. **Access your server**: `https://your-app.railway.app/mcp`

### Use Your Deployed Server
```json
{
  "mcpServers": {
    "Excel Analyser MCP (Cloud)": {
      "type": "http", 
      "url": "https://your-app.railway.app/mcp"
    }
  }
}
```

šŸ“– **Full deployment guide**: See [docs/DEPLOYMENT.md](./docs/DEPLOYMENT.md) for detailed instructions, security considerations, and alternative platforms.

## šŸ“š Documentation

Additional documentation is available in the `docs/` directory:

- `docs/DEPLOYMENT.md` - Complete deployment guide for Railway and other cloud platforms
- `docs/URL_SUPPORT.md` - Guide for adding URL support to handle cloud-based file access

---

## Notes
- **Supported file types:** `.xlsx`, `.csv`, and `.json` files
- **JSON file requirements:** Must contain an array of objects
- **Excel files:** Only the first sheet is used by default in chunked operations
- **Automatic pagination:** JSON files with >1000 entries automatically use pagination
- **Chunk sizes:** Default 1000 for optimal performance, configurable per request
- **Error handling:** Comprehensive error messages for file not found, invalid formats, etc.

---

## Testing

The project includes test files for both Excel/CSV and JSON functionality in the `tests/` directory:

- `tests/test-readExcelFile.js` - Test Excel/CSV reading functionality
- `tests/test-readJsonFile.js` - Test JSON reading functionality  
- `tests/test-http-transport.js` - Test HTTP transport connectivity
- `tests/test-deployment.js` - Test deployed server functionality
- `tests/test-data.json` - Sample JSON file for testing
- `tests/dummy_excel_file.xlsx` - Sample Excel file for testing

To run tests:
```bash
# Test file processing
npm test                    # Excel/CSV test
npm run test-json          # JSON test
npm run test-all           # All file processing tests

# Test HTTP transport (requires server running)
npm run start:http         # Terminal 1: Start HTTP server
npm run test-http          # Terminal 2: Test HTTP connectivity

# Test deployed server
npm run test-deployment https://your-deployed-url.com
```

---

## Feedback & Support

We value your feedback and are committed to improving Excel Analyser MCP. Here are several ways you can reach out:

### šŸ› Found a Bug?
- **GitHub Issues**: [Report bugs here](https://github.com/contactakagrawal/excel-analyser-mcp/issues/new?assignees=&labels=bug&template=bug_report.md&title=%5BBUG%5D)
- Please include:
  - Steps to reproduce the issue
  - Expected vs actual behavior
  - File type and size (if applicable)
  - Error messages or logs

### šŸ’” Feature Requests & Enhancements
- **GitHub Issues**: [Request features here](https://github.com/contactakagrawal/excel-analyser-mcp/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=%5BFEATURE%5D)
- **GitHub Discussions**: [Start a discussion](https://github.com/contactakagrawal/excel-analyser-mcp/discussions) for ideas and general feedback

### šŸ“ General Feedback
- **Email**: [contactakagrawal@gmail.com](mailto:contactakagrawal@gmail.com)
- **GitHub Discussions**: [General feedback](https://github.com/contactakagrawal/excel-analyser-mcp/discussions/categories/general)

### šŸ¤ Contributing
We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for more information on how to:
- Submit pull requests
- Report issues
- Suggest improvements
- Help with documentation

### ⭐ Show Your Support
If you find this project helpful, please consider:
- Giving it a ⭐ star on GitHub
- Sharing it with others who might benefit
- Contributing to the codebase

---

## License
ISC