数据集查询服务

一个基于Model Context Protocol (MCP)的服务器,为AI助手提供对CSV文件中的表格数据集的类型安全查询、过滤和检索功能。

  • by MikeORed
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 MikeORed/catalog-mcp

使用说明

MCP数据目录

一种模型上下文协议(MCP)服务器,为AI助手提供对CSV文件中表格数据集的结构化访问。通过干净、类型安全的界面查询、过滤和检索数据。

功能(MVP)

✅ 4个MCP工具

  • list_datasets -列出所有可用数据集
  • describe_dataset -获取架构和字段信息
  • query_dataset -使用过滤器、投影和限制进行查询
  • get_by_id -按查找键检索特定行

✅ 类型安全架构

  • 字符串、数字、布尔值和枚举字段类型
  • 现场验证和类型检查
  • 所需的现场执行

✅ 过滤(MVP)

  • eq (等于)
  • contains (不区分大小写的子字符串)
  • and (多种条件)

✅ 智能限制

  • 每个数据集的行限制
  • 截断指示器
  • 可配置的默认值

✅ 热重新加载

  • 配置更改会自动应用(1-3ms)
  • 无需重新启动服务器
  • 安全地拒绝无效的配置

✅ 稳定MVP

  • 六边形架构
  • 全面的测试覆盖率
  • 类型安全实施
  • 生产质量错误处理

快速开始

1.安装

npm install
npm run build

2.配置

复制示例配置:

cp examples/config/typical.json config/datasets.json

或者创建自己的:

{
  "datasets": [
    {
      "id": "users",
      "name": "User Directory",
      "schema": {
        "fields": [
          { "name": "id", "type": "number", "required": true },
          { "name": "name", "type": "string", "required": true },
          { "name": "email", "type": "string", "required": true },
          { "name": "role", "type": "enum", "values": ["admin", "user", "guest"] }
        ],
        "visibleFields": ["id", "name", "email", "role"]
      },
      "source": {
        "type": "csv",
        "path": "./data/users.csv"
      },
      "lookupKey": "id",
      "limits": {
        "maxRows": 100,
        "defaultRows": 20
      }
    }
  ]
}

3.跑步

npm run dev

服务器在stdio上启动,并公开4个MCP工具。


用法

MCP客户端配置

添加到您的MCP客户端配置中(例如,Claude Desktop):

{
  "mcpServers": {
    "catalog": {
      "command": "node",
      "args": ["/path/to/catalog-mcp/dist/index.js"],
      "env": {
        "CONFIG_PATH": "/path/to/config/datasets.json"
      }
    }
  }
}

注: 替换 /path/to/... 使用您的实际本地文件路径。MCP服务器作为Node.js进程运行,并读取 CONFIG_PATH 启动时的环境变量。

可用工具

1.列表_数据集

列出所有已配置的数据集。

请求:

{
  "tool": "list_datasets"
}

答复:

{
  "datasets": [
    {
      "id": "users",
      "name": "User Directory"
    },
    {
      "id": "products",
      "name": "Product Catalog"
    }
  ]
}

2.描述数据集

获取数据集的详细架构信息。

请求:

{
  "tool": "describe_dataset",
  "arguments": {
    "datasetId": "users"
  }
}

答复:

{
  "id": "users",
  "name": "User Directory",
  "fields": [
    {
      "name": "id",
      "type": "number",
      "required": true
    },
    {
      "name": "name",
      "type": "string",
      "required": true
    },
    {
      "name": "role",
      "type": "enum",
      "values": ["admin", "user", "guest"]
    }
  ],
  "lookupKey": "id",
  "limits": {
    "maxRows": 100,
    "defaultRows": 20
  }
}

3.查询数据集

使用可选过滤器、字段投影和限制查询数据集。

简单查询:

{
  "tool": "query_dataset",
  "arguments": {
    "datasetId": "users",
    "limit": 10
  }
}

使用过滤器:

{
  "tool": "query_dataset",
  "arguments": {
    "datasetId": "users",
    "filters": {
      "field": "role",
      "op": "eq",
      "value": "admin"
    },
    "limit": 10
  }
}

使用多个过滤器:

{
  "tool": "query_dataset",
  "arguments": {
    "datasetId": "users",
    "filters": {
      "and": [
        { "field": "role", "op": "eq", "value": "admin" },
        { "field": "name", "op": "contains", "value": "smith" }
      ]
    }
  }
}

使用现场投影:

{
  "tool": "query_dataset",
  "arguments": {
    "datasetId": "users",
    "fields": ["id", "name"],
    "limit": 10
  }
}

答复:

{
  "rows": [
    { "id": 1, "name": "Alice Smith", "email": "alice@example.com", "role": "admin" },
    { "id": 6, "name": "Frank Miller", "email": "frank@example.com", "role": "admin" }
  ],
  "fields": ["id", "name", "email", "role"],
  "rowsReturned": 2,
  "totalRows": 2,
  "truncated": false
}

4.获取_ _ id

按查找键检索单行。

请求:

{
  "tool": "get_by_id",
  "arguments": {
    "datasetId": "users",
    "id": "1"
  }
}

答复:

{
  "row": {
    "id": 1,
    "name": "Alice Smith",
    "email": "alice@example.com",
    "role": "admin"
  }
}

如果未找到:

{
  "row": null
}

过滤器操作员

MVP支持三个运算符:

eq(等于)

完全匹配(字符串区分大小写)。

{
  "field": "role",
  "op": "eq",
  "value": "admin"
}

包含(子字符串)

不区分大小写的子字符串搜索。

{
  "field": "name",
  "op": "contains",
  "value": "smith"
}

和(连词)

所有条件都必须为真。

{
  "and": [
    { "field": "role", "op": "eq", "value": "admin" },
    { "field": "active", "op": "eq", "value": true }
  ]
}

筛选器架构

所有过滤器表达式都遵循以下规范的JSON结构:

简单过滤器:

{
  "field": "fieldName",
  "op": "eq" | "contains",
  "value": any
}

复合过滤器(和):

{
  "and": [
    { "field": "...", "op": "...", "value": ... },
    { "field": "...", "op": "...", "value": ... }
  ]
}

MVP后: 其他运营商即将到来(ne, gt, gte, lt, lte, in, or)使用相同的结构。


配置

数据集结构

{
  "datasets": [
    {
      "id": "string",              // Unique identifier
      "name": "string",            // Display name
      "schema": {
        "fields": [                // Field definitions
          {
            "name": "string",      // Field name (matches CSV header)
            "type": "string",      // string | number | boolean | enum
            "required": boolean,   // Optional, default: false
            "values": ["..."]      // Required for enum type
          }
        ],
        "visibleFields": ["..."]   // Fields accessible in queries
      },
      "source": {
        "type": "csv",             // Only CSV in MVP
        "path": "string"           // Relative path to CSV file
      },
      "lookupKey": "string",       // Optional, field name for get_by_id
      "limits": {
        "maxRows": number,         // Hard limit
        "defaultRows": number      // Default when not specified
      }
    }
  ]
}

字段类型

类型 描述 示例值
string 文本数据 "Alice", "alice@example.com"
number 数字数据 42, 99.99, -5
boolean 正确/错误 true, false
enum 预定义值 "admin" (必须在 values 阵列)

配置格式

配置用途 JSON 格式。这是MVP的主要和推荐格式。

注: 在未来的版本中可能会添加对YAML的支持,但JSON仍然是规范格式。

配置验证

服务器在启动时验证配置并拒绝无效的配置:

✅ 已执行的检查:

  • 所有必填字段均已显示
  • 字段类型有效
  • 枚举字段不为空 values 数组
  • visibleFields 引用现有字段
  • lookupKey 引用现有字段
  • 数据集ID是唯一的
  • 限制有效(正,maxRows≥defaultRows)
  • CSV文件存在并且可读

快速失败: 无效的配置会阻止服务器启动,并显示明确的错误消息。


CSV文件格式

需求

  1. 标题行 列名称(第一行)
  2. 列名 必须与字段定义匹配(区分大小写)
  3. 数据类型 必须与字段类型匹配
  4. UTF-8编码
  5. 标准CSV格式 (逗号分隔)

示例

id,name,email,role,active
1,Alice Smith,alice@example.com,admin,true
2,Bob Johnson,bob@example.com,user,true
3,Charlie Brown,charlie@example.com,guest,false

类型格式

布尔值: 必须是 true 或 false (小写)

active
true
false

编号: 整数或小数

price,quantity
99.99,5
149.99,10

枚举: 必须与配置的值之一匹配

role
admin
user
guest

热重新加载

配置更改会自动检测到:

  1. 编辑 config/datasets.json
  2. 保存文件
  3. 更改将在1-3ms内生效(仅限目录交换)
  4. 无效更改被拒绝(保持当前配置)

查看日志:

[INFO] Config reloaded successfully in 2ms

它是如何工作的:

  • 监视配置文件是否有更改
  • 更改时:验证新配置
  • 如果有效:原子交换到新目录
  • 如果无效:保留当前状态,记录错误

无需重新启动服务器!


人工智能使用指南

此服务器针对以下方面进行了优化 对CSV支持的参考数据的本地、模式感知访问 –我用于项目设计、探索、文档聚合和爱好系统的数据类型。对于高容量或关键任务的生产工作负载,您通常会将LLM与专用的数据库支持的MCP服务器配对,并使此目录专注于代理附近的轻量级、结构化数据集。

设计数据集时:

人工智能数据集设计

保持数据集集中:

  • 小型单用途桌子比大型多用途桌子效果更好
  • 将参考数据(ID、名称、代码)与描述性内容分开
  • 将复杂的领域分解为多个相关的数据集

优化代币效率:

  • 使用 visibleFields 仅显示必要的列
  • 保持字段名称简短但有意义
  • 在过滤时,更喜欢ID和代码而不是长文本字段

稳定查询设计:

  • 使用一致、稳定的标识符(数字ID、SKU、代码)
  • 避免依赖自由文本名称作为查找关键字
  • 规范化分类数据(使用枚举,而不是自由文本)

过滤结构:

  • 基于标记的字段支持灵活的查询(status, category, type)
  • 为受控词汇表使用枚举
  • 常用过滤器的布尔标志(active, published, available)

示例模式:

  • 索引数据集: ID、名称、标签、状态(小,经常查询)
  • 详细数据集: 所有字段的完整记录(按ID查询)
  • 参考数据集: 查找表、枚举、测量量表(小、稳定)

建筑

该项目如下 六边形体系结构 为了清晰地分离关注点:

┌─────────────────────────────────────────────────────┐
│              Primary Adapters (MCP)                 │
│                       ↓                             │
│              Primary Ports (Tools)                  │
│                       ↓                             │
│              Use Cases (Business Logic)             │
│                       ↓                             │
│              Domain Layer (Pure Logic)              │
│                       ↓                             │
│              Secondary Ports (Storage)              │
│                       ↓                             │
│         Secondary Adapters (CSV, Config)            │
└─────────────────────────────────────────────────────┘

关键原则:

  • 域层没有外部依赖关系
  • 依赖关系指向内部(适配器→ 域)
  • 业务逻辑是孤立的,可测试的
  • 易于使用新适配器进行扩展

看 docs/dev/mcp数据目录.md 获取详细的架构文档。


例子

这 examples/ 目录包含:

配置

  • minimal.json -单个数据集,基本特征
  • typical.json -多个数据集,常见模式
  • advanced.json -具有许多功能的复杂场景

数据集

  • minimal.csv -5行,2列
  • sample-users.csv -10个具有角色的用户
  • sample-products.csv -15产品分类
  • employees.csv -15名部门员工
  • inventory.csv -20个库存项目
  • orders.csv -20客户订单

试试看:

cp examples/config/typical.json config/datasets.json
npm run dev

看 示例/README.md 详细文档。


发展

设置

npm install
npm run build

以开发模式运行

npm run dev

运行测试

# All tests
npm test

# With coverage
npm run test:coverage

# Watch mode
npm run test:watch

为生产而建

npm run build

输出在 dist/ 目录。


测试

测试覆盖范围:

  • 全面的测试套件,覆盖率高
  • 领域逻辑和用例的单元测试
  • MCP工具和热重载的集成测试
  • 跟踪报表和分支机构的覆盖范围

测试结构:

test/
├── unit/
│   ├── domain/           # Domain services and value objects
│   └── use-cases/        # Use case orchestration
└── integration/
    ├── mcp-tools.test.ts           # All 4 MCP tools
    ├── config-hot-reload.test.ts   # Hot reload behavior
    ├── csv-hot-visibility.test.ts  # Visible fields
    └── limits-and-truncation.test.ts # Row limits

演出

特点:

  • 配置重新加载:1-3ms(仅目录交换)
  • CSV加载:每个文件5-10ms(因大小而异)
  • 查询执行:内存操作1-2ms
  • 内存:O(n),其中n=数据集大小

CSV加载行为:

  • 读取CSV文件 按需 对于每个查询
  • CSV数据无内存缓存
  • 这使内存使用率保持较低水平,但在查询延迟中包括文件I/O
  • 配置目录已缓存;每次查询只加载CSV数据

可扩展性:

  • 适用于最多约100K行的数据集
  • 查询延迟包括文件读取时间(每个CSV约5-10ms)
  • 对于高性能或大型数据集,使用数据库后端(MVP后)
  • 考虑数据集设计:多个小型CSV比一个大型CSV更好

路线图

✅ MVP完成(全部6个阶段)

  • [x] 六边形架构
  • [x] 4个MCP工具(列表、描述、查询、get_by_id)
  • [x] MVP过滤器运算符(eq、contains和)
  • [x] 类型验证(字符串、数字、布尔值、枚举)
  • [x] 热重载支持
  • [x] 全面的测试覆盖率
  • [x] 错误处理和日志记录
  • [x] 完整的文档(README、开发指南、示例)

🚀 发布MVP功能

  • []其他筛选运算符(ne、gt、gte、lt、lte、in或)
  • []排序(按顺序)
  • []复杂类型(数组、嵌套对象)
  • []多个数据源(PostgreSQL、SQLite、JSON)
  • []聚合(COUNT、SUM、AVG等)
  • []全文搜索
  • []性能缓存层
  • []GraphQL风格的查询语言

看 docs/project plans/project-plan-v1.final.md 了解详情。


文档


贡献

欢迎投稿!该项目如下:

  1. 六边形架构 -保持域名纯净
  2. 测试驱动开发 -先写测试
  3. 类型安全性 -利用TypeScript
  4. 清洁代码 -遵循现有模式

看 .clinerules/core-rules.md 建筑指南。


故障排除

服务器无法启动

检查配置:

node dist/index.js
# Look for validation errors in output

常见问题:

  • CSV文件路径不正确
  • 字段类型不匹配
  • 缺少必填字段
  • 重复的数据集ID

查询未返回任何结果

验证数据集:

{
  "tool": "describe_dataset",
  "arguments": { "datasetId": "your-dataset" }
}

检查:

  • 数据集ID正确
  • CSV文件有数据
  • 筛选器匹配字段类型
  • 字段名称位于 visibleFields

热重载不工作

验证文件监视:

  • 配置文件路径正确
  • 文件系统权限允许读取
  • 检查服务器日志以确认重新加载

许可证

麻省理工学院


鸣谢

内置:


项目状态

版本: 1.0.0-mvp
状态: 稳定MVP
最后更新时间: 2025-11-30

注: 徽章上的测试和性能数字反映了发布时的状态。专为生产风格的工作负载而设计,但要验证性能并适合您的特定环境。

所有6个阶段均已完成:

  • ✅ 第1阶段:骨架和配置
  • ✅ 第二阶段:核心用例
  • ✅ 阶段3:热重新加载
  • ✅ 第4阶段:MCP适配器
  • ✅ 第5阶段:硬化和测试
  • ✅ 第6阶段:文件编制

看 docs/execution/master-checklist.md 详细进展。