自然语言SQL查询服务

一个基于AI的模型上下文协议(MCP)服务器,支持通过自然语言查询SQL数据库,自动生成并执行SQL查询。

  • by DonMul
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 DonMul/MCP-Data-Analyst

使用说明

MCP数据分析师

一个模型上下文协议(MCP)服务器,支持使用人工智能对SQL数据库进行自然语言查询。连接您的数据库并用简单的英语提问-服务器将为您生成并执行SQL查询。

特性

  • 🤖 自然语言转SQL:用简单的英语提问,获取SQL结果
  • 🔌 多数据库支持MySQL、PostgreSQL、MSSQL、MongoDB、SQLite、SSAS(MDX)、Elasticsearch(SQL)、InfluxDB(InfluxQL)
  • 📊 架构自动发现:自动扫描和缓存数据库架构
  • 🛠️ MCP集成:与MCP兼容的客户端无缝协作
  • ⚡ 高效:连接池和模式缓存以提高性能
  • 🔒 按设计只读:只执行SELECT样式的查询

查询语言

  • 结构化查询语言:MySQL、PostgreSQL、MSSQL、SQLite、Elasticsearch(SQL API)
  • MDX:SSAS
  • InfluxQL:InfluxDB

安装

先决条件

  • Python 3.12或更高版本
  • MySQL、PostgreSQL、MSSQL、MongoDB、SQLite、SSAS、Elasticsearch或InfluxDB之一
  • OpenAI API密钥(或兼容的API端点)

设置

  1. 克隆存储库:

    cd /path/to/your/workspace
    
  2. 创建虚拟环境 (推荐):

    python3 -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  3. 安装依赖项:

    pip install -r requirements.txt
    
  4. 配置环境变量:

    复制下面的示例并创建 .env 文件:

    # LLM Configuration
    LLM_API_KEY=your-api-key-here
    LLM_MODEL=gpt-3.5-turbo
    LLM_API_URL=https://api.openai.com/v1
    
    

数据库配置

DB_TYPE=mysql#mysql|postgresql|mssql|mongodb|sqlite|ssas|elasticsearch|influexdb DB_HOST=127.0.0.1 DB_PORT=3306#5432(PostgreSQL)、1433(MSSQL)、27017(MongoDB)、2383(SSAS)、9200(Elasticsearch)、8086(InfluxDB) DB_USER=根 DB_PASSWORD=您的密码 DB_NAME=您的数据库名称#对于InfluxDB:数据库名称;对于SSAS/Elasticsearch:目录/索引数据库名称

仅限SQLite

DB_PATH=数据库.DB


## Usage

### Running the MCP Server

Start the server using the standard MCP stdio transport:

```bash
python server.py

服务器将:

  1. 验证配置
  2. 连接到您的数据库
  3. 构建架构缓存
  4. 开始监听MCP请求

可用的MCP工具

服务器公开了MCP客户端可以调用的3个工具:

1. query_database_with_prompt

用自然语言提问并获得SQL结果。

# Example: "Show me the top 5 customers by total purchases"
{
  "success": true,
  "query": "SELECT c.name, SUM(o.total) as total_purchases FROM customers c...",
  "data": [...]
}

2. get_database_schema

检索完整的数据库架构。

{
  "success": true,
  "schema": {
    "users": {
      "name": "users",
      "columns": {...}
    }
  }
}

3. build_db_definition

从数据库重建架构缓存。

{
  "success": true,
  "message": "Successfully loaded schema for 8 tables",
  "tables": ["users", "orders", "products", ...]
}

与MCP客户端集成

要将此服务器与MCP客户端(如Claude Desktop)一起使用,请将其添加到MCP配置中:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

视窗: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "data-analyst": {
      "command": "python",
      "args": ["/path/to/mcp-data-analyst/server.py"],
      "env": {
        "LLM_API_KEY": "your-key",
        "DB_TYPE": "mysql",
        "DB_HOST": "localhost",
        "DB_NAME": "your_db"
      }
    }
  }
}

发展

添加新的数据库类型

  1. 在中创建新文件 DataAnalyst/database/Type/ (例如。, SQLite.py)
  2. 扩展 BaseDatabase 抽象类
  3. 实施所有必需的方法: __init__, execute_query, build_definition, close
  4. 将新类型添加到 DbTypes 枚举
  5. 更新 DataAnalyst/database/Type/__init__.py 导出您的类
  6. 更新 server.py 处理新的数据库类型

示例

示例1:客户分析

Query: "Show me the top 10 customers by total order value"

Generated SQL:
SELECT c.customer_name, SUM(o.total_amount) as total_value
FROM customers c
JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.customer_name
ORDER BY total_value DESC
LIMIT 10;

示例2:产品库存

Query: "Which products are low in stock (less than 10 units)?"

Generated SQL:
SELECT product_name, quantity_in_stock
FROM products
WHERE quantity_in_stock < 10
ORDER BY quantity_in_stock ASC;

贡献

欢迎投稿!请确保:

  1. 代码遵循PEP 8风格指南
  2. 所有函数都有类型提示和文档字符串
  3. 新的数据库类型扩展 BaseDatabase
  4. 更改保持向后兼容性

支持

对于问题、疑问或贡献,请在存储库上打开问题。


内置于: