Skip to main content
Glama
README.md
# Yxcel

> **Y**uan + Ex**cel** · 把 Excel 交给 AI Agent,问一句话,拿回答案 + 一张新表格。

Yxcel 是一个 [MCP](https://modelcontextprotocol.io)(Model Context Protocol)服务器,它把 Excel 文件变成可查询的数据库。导入 `.xlsx` / `.xls` 文件后,AI Agent 就能通过结构化工具调用对数据做筛选、聚合、分组、排序,并自动把结果导出成新的 Excel 文件——不需要写一行 SQL,也不需要 Agent 自己配大模型。

## 设计理念

Yxcel 不自己做"大脑",它只做可靠的"数据层"。LLM 编排、对话管理、推理决策全部交给外部 Agent,Yxcel 专注于把 Excel 解析、存储、查询、导出这几件事做到位。

```
┌─────────────┐     MCP (stdio)     ┌──────────────────┐
│   Agent      │ ◄──────────────►  │      Yxcel        │
│             │  tool calls:        │                   │
│ · LLM 编排   │  import_excel       │  智能 Excel 解析   │
│ · 对话管理   │  list_documents     │  内存查询引擎      │
│ · 推理决策   │  query_data         │  结果导出 .xlsx    │
│ · 结果呈现   │  get_schema         │  SQLite 存储       │
│             │  delete_document    │                   │
└─────────────┘                    └──────────────────┘
```

## 工作流程

```
Excel 文件 ──import_excel──► SQLite(自动解析表头/类型/裁剪表尾)
                                    │
   Agent 提问 ──query_data──► 查询结果 + 自动导出的 .xlsx 文件
```

## 工具一览

| 工具 | 说明 |
|------|------|
| `import_excel` | 导入 Excel 文件。自动识别表头行、推断列类型(text/number/date)、裁剪"合计/总计"表尾行。 |
| `list_documents` | 列出所有已导入文件及元数据(行数、表数、状态等)。 |
| `get_schema` | 获取某个文档的列定义和每个 sheet 的前 5 行样本数据。 |
| `query_data` | 筛选、聚合、分组、排序——结果自动导出为 `.xlsx`,返回文件路径。 |
| `delete_document` | 删除文档及其全部数据(级联删除关联行与物理文件)。 |

### query_data 参数

| 参数 | 类型 | 说明 |
|------|------|------|
| `document_id` | string | 由 `import_excel` 返回的文档 ID |
| `sheet_name` | string | 要查询的工作表名 |
| `filters` | array? | 过滤条件(AND 逻辑),见下方操作符 |
| `aggregations` | array? | 聚合操作:`count` / `sum` / `avg` / `min` / `max` |
| `group_by` | string[]? | 分组列 |
| `order_by` | object? | 排序:`{ column, direction: "asc"\|"desc" }` |
| `limit` | number? | 返回行数上限 |

**过滤操作符**:`=` `!=` `>` `<` `>=` `<=` `contains` `not_contains` `in` `not_in` `between` `is_null`

> 数字列比较自动去除千分位逗号并按数值大小比较,避免 `"1500" < "200"` 这类字符串陷阱。

## 智能解析

Excel 文件往往不规整,Yxcel 的解析器针对真实数据做了处理:

- **智能表头扫描**:在前 5 行中用评分算法定位真正的表头行(中文字段关键词加分、纯数字/重复值减分)
- **列类型推断**:结合列名关键词和值分布投票判定 text / number / date
- **表尾裁剪**:自动剔除"合计/总计/小计/平均/汇总"行
- **日期标准化**:统一格式化为 `YYYY-MM-DD`
- **容错处理**:空列名自动生成、重名列去重、全空行过滤

## 安装

```bash
git clone https://github.com/Yuan-lai-ru-ci/Yxcel.git
cd Yxcel
npm install
npm run build
```

## 接入 MCP

在你的 MCP 配置(`mcp.json`)中加入:

```json
{
  "servers": {
    "yxcel": {
      "command": "npx",
      "args": ["tsx", "path/to/yxcel/src/index.ts"],
      "type": "stdio",
      "enabled": true
    }
  }
}
```

## 使用示例

导入后,Agent 可以这样组合调用:

> **用户**:分析这份社区企业名单里各类主体的数量分布

```jsonc
// Agent → query_data
{
  "document_id": "48858d3f-...",
  "sheet_name": "企业及个体户名单",
  "group_by": ["主体类型"],
  "aggregations": [{ "function": "count", "column": "序号", "alias": "数量" }]
}
// ← 返回
// 个体工商户: 480, 企业: 320
// 并自动导出 .../exports/...名单_企业及个体户名单_<时间戳>.xlsx
```

## 开发

```bash
npm run dev      # tsx watch(热重载)
npm run build    # tsc → dist/
npm start        # 运行一次
```

## 技术栈

- TypeScript(ESM)
- SQLite(better-sqlite3,WAL 模式)
- MCP SDK(@modelcontextprotocol/sdk)
- Excel 解析与导出(xlsx)

## License

MIT

Maintenance

ActivityStale
ResponsivenessNo issues