数据库交互协议服务器

SingleStore MCP Server是一个用于与SingleStore数据库交互的模型上下文协议服务器,提供查询表、描述模式和生成ER图等功能。

  • by madhukarkumar
  • JavaScript
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 madhukarkumar/singlestore-mcp-server

使用说明

单存储MCP服务器

用于与SingleStore数据库交互的模型上下文协议(MCP)服务器。此服务器提供用于查询表、描述模式和生成ER图的工具。

特性

  • 列出数据库中的所有表
  • 执行自定义SQL查询
  • 获取包括模式和示例数据在内的详细表信息
  • 生成数据库模式的Mermaid ER图
  • SSL支持自动获取CA包
  • 正确的错误处理和TypeScript类型安全

先决条件

  • Node.js 16或更高版本
  • npm或纱线
  • 访问SingleStore数据库
  • SingleStore CA捆绑包(自动从门户获取)

安装

通过Smithery安装

通过以下方式自动安装克劳德桌面的SingleStore MCP服务器 史密瑟里:

npx -y @smithery/cli install @madhukarkumar/singlestore-mcp-server --client claude
  1. 克隆存储库:
git clone <repository-url>
cd mcp-server-singlestore
  1. 安装依赖项:
npm install
  1. 构建服务器:
npm run build

环境变量

所需的环境变量

服务器需要以下环境变量才能连接数据库:

SINGLESTORE_HOST=your-host.singlestore.com
SINGLESTORE_PORT=3306
SINGLESTORE_USER=your-username
SINGLESTORE_PASSWORD=your-password
SINGLESTORE_DATABASE=your-database

服务器需要所有这些环境变量才能建立与SingleStore数据库的连接。该连接使用SSL和SingleStore CA捆绑包,该捆绑包是从SingleStore门户自动获取的。

可选环境变量

对于SSE(服务器发送事件)协议支持:

SSE_ENABLED=true       # Enable the SSE HTTP server (default: false if not set)
SSE_PORT=3333          # HTTP port for the SSE server (default: 3333 if not set)

设置环境变量

  1. 在你的壳: 在运行服务器之前,在终端中设置变量:

    export SINGLESTORE_HOST=your-host.singlestore.com
    export SINGLESTORE_PORT=3306
    export SINGLESTORE_USER=your-username
    export SINGLESTORE_PASSWORD=your-password
    export SINGLESTORE_DATABASE=your-database
    
  2. 在客户端配置文件中: 将变量添加到MCP客户端配置文件中,如下面的集成部分所示。

用法

协议支持

此服务器支持两种客户端集成协议:

  1. MCP协议:使用stdio通信的标准模型上下文协议,由Claude Desktop、Windsurf和Cursor使用。
  2. SSE协议:服务器通过HTTP发送事件,用于需要实时数据流的基于web的客户端和应用程序。

这两种协议都公开了相同的工具和功能,允许您为您的用例选择最佳的集成方法。

可用工具

  1. list_tables

    • 列出数据库中的所有表
    • 无需参数
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "list_tables",
      arguments: {}
    })
    
  2. 查询表

    • 执行自定义SQL查询
    • 参数:
      • 查询:SQL查询字符串
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "query_table",
      arguments: {
        query: "SELECT * FROM your_table LIMIT 5"
      }
    })
    
  3. describe_table

    • 获取有关表的详细信息
    • 参数:
      • 表:表名称
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "describe_table",
      arguments: {
        table: "your_table"
      }
    })
    
  4. 发电机图

    • 生成数据库模式的Mermaid ER图
    • 无需参数
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "generate_er_diagram",
      arguments: {}
    })
    
  5. run_read_query

    • 对数据库执行只读(SELECT)查询
    • 参数:
      • 查询:要执行的SQL SELECT查询
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "run_read_query",
      arguments: {
        query: "SELECT * FROM your_table LIMIT 5"
      }
    })
    
  6. create_table

    • 在数据库中创建具有指定列和约束的新表
    • 参数:
      • table_name:要创建的表的名称
      • columns:列定义数组
      • table_options:可选表配置
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "create_table",
      arguments: {
        table_name: "new_table",
        columns: [
          {
            name: "id",
            type: "INT",
            nullable: false,
            auto_increment: true
          },
          {
            name: "name",
            type: "VARCHAR(255)",
            nullable: false
          }
        ],
        table_options: {
          shard_key: ["id"],
          sort_key: ["name"]
        }
      }
    })
    
  7. 生成_合成_数据

    • 生成合成数据并将其插入到现有表中
    • 参数:
      • table:要插入数据的表的名称
      • count:要生成的行数(默认值:100)
      • column_generators:特定列的自定义生成器
      • batch_size:每批中要插入的行数(默认值:1000)
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "generate_synthetic_data",
      arguments: {
        table: "customers",
        count: 1000,
        column_generators: {
          "customer_id": {
            "type": "sequence",
            "start": 1000
          },
          "status": {
            "type": "values",
            "values": ["active", "inactive", "pending"]
          },
          "signup_date": {
            "type": "formula",
            "formula": "NOW() - INTERVAL FLOOR(RAND() * 365) DAY"
          }
        },
        batch_size: 500
      }
    })
    
  8. optimize_sql

    • 使用PROFILE分析SQL查询并提供优化建议
    • 参数:
      • 查询:用于分析和优化的SQL查询
    use_mcp_tool({
      server_name: "singlestore",
      tool_name: "optimize_sql",
      arguments: {
        query: "SELECT * FROM customers JOIN orders ON customers.id = orders.customer_id WHERE region = 'west'"
      }
    })
    
    • 答复包括:
      • 原始查询
      • 性能概要(总运行时间、编译时间、执行时间)
      • 检测到的瓶颈列表
      • 影响水平(高/中/低)的优化建议
      • 索引、连接、内存使用和其他优化建议

独立运行

  1. 构建服务器:
npm run build
  1. 仅使用MCP协议运行服务器:
node build/index.js
  1. 使用MCP和SSE协议运行服务器:
SSE_ENABLED=true SSE_PORT=3333 node build/index.js

使用SSE协议

启用SSE后,服务器将公开以下HTTP端点:

  1. 根端点

    GET /
    

    返回服务器信息和可用终结点。

  2. 健康检查

    GET /health
    

    返回服务器的状态信息。

  3. SSE 连接

    GET /sse
    

    建立服务器发送事件连接以进行实时更新。

  4. 列出工具

    GET /tools
    

    返回所有可用工具的列表,与MCP相同 list_tools 功能。

    还支持MCP检查器兼容性的POST请求:

    POST /tools
    Content-Type: application/json
    
    {
      "jsonrpc": "2.0",
      "id": "request-id",
      "method": "mcp.list_tools",
      "params": {}
    }
    
  5. 呼叫工具

    POST /call-tool
    Content-Type: application/json
    
    {
      "name": "tool_name",
      "arguments": {
        "param1": "value1",
        "param2": "value2"
      },
      "client_id": "optional_sse_client_id_for_streaming_response"
    }
    

    使用提供的参数执行工具。

    • 如果 client_id 响应被流式传输到该SSE客户端。
    • 如果 client_id 如果省略,则直接在HTTP响应中返回响应。

    还支持标准MCP格式,以兼容MCP检查器:

    POST /call-tool
    Content-Type: application/json
    
    {
      "jsonrpc": "2.0",
      "id": "request-id",
      "method": "mcp.call_tool",
      "params": {
        "name": "tool_name",
        "arguments": {
          "param1": "value1",
          "param2": "value2"
        },
        "_meta": {
          "client_id": "optional_sse_client_id_for_streaming_response"
        }
      }
    }
    

SSE事件类型

使用SSE连接时,服务器会发送以下事件类型:

  1. 消息 (未命名事件):成功建立SSE连接时发送。
  2. 打开:已建立其他连接事件。
  3. 消息:用于所有MCP协议消息,包括工具启动、结果和错误事件。

所有事件都遵循MCP协议使用的JSON-RPC 2.0格式。系统使用标准 message 事件类型,以与MCP检查器和大多数SSE客户端库兼容。

JavaScript客户端示例

// Connect to SSE endpoint
const eventSource = new EventSource('http://localhost:3333/sse');
let clientId = null;

// Handle connection establishment via unnamed event
eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.type === 'connection_established') {
    clientId = data.clientId;
    console.log(`Connected with client ID: ${clientId}`);
  }
};

// Handle open event
eventSource.addEventListener('open', (event) => {
  console.log('SSE connection opened via open event');
});

// Handle all MCP messages
eventSource.addEventListener('message', (event) => {
  const data = JSON.parse(event.data);
  
  if (data.jsonrpc === '2.0') {
    if (data.result) {
      console.log('Tool result:', data.result);
    } else if (data.error) {
      console.error('Tool error:', data.error);
    } else if (data.method === 'mcp.call_tool.update') {
      console.log('Tool update:', data.params);
    }
  }
});

// Call a tool with streaming response (custom format)
async function callTool(name, args) {
  const response = await fetch('http://localhost:3333/call-tool', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: name,
      arguments: args,
      client_id: clientId
    })
  });
  return response.json();
}

// Call a tool with streaming response (MCP format)
async function callToolMcp(name, args) {
  const response = await fetch('http://localhost:3333/call-tool', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'request-' + Date.now(),
      method: 'mcp.call_tool',
      params: {
        name: name,
        arguments: args,
        _meta: {
          client_id: clientId
        }
      }
    })
  });
  return response.json();
}

// Example usage
callTool('list_tables', {})
  .then(response => console.log('Request accepted:', response));

与MCP检查器一起使用

MCP Inspector是一个基于浏览器的工具,用于测试和调试MCP服务器。要将其与此服务器一起使用,请执行以下操作:

  1. 在一个命令中启动服务器和MCP检查器:

    npm run inspector
    

    或者只启动服务器:

    npm run start:inspector
    
  2. 要单独安装和运行MCP检查器:

    npx @modelcontextprotocol/inspector
    

    检查器将在默认浏览器中打开。

  3. 当MCP检查器打开时:

    a.在连接字段中输入URL:

    http://localhost:8081
    

    注意:实际端口可能因配置而异。检查服务器 正在使用的实际端口的启动日志。服务器将输出:

    MCP SingleStore SSE server listening on port XXXX
    

    b.确保选择“SSE”作为传输类型

    c.点击“连接”

  4. 如果您遇到连接问题,请尝试以下替代方案:

    a.尝试连接到特定端点:

    http://localhost:8081/stream
    

    b.尝试使用您计算机的实际IP地址:

    http://192.168.1.x:8081
    

    c.如果在Docker中运行:

    http://host.docker.internal:8081
    
  5. 调试连接问题:

    a.通过访问验证服务器是否正在运行http://localhost:8081在您的浏览器中

    b.检查服务器日志中的连接尝试

    c.尝试重新启动服务器和检查器

    d.确保没有其他服务正在使用端口8081

    e.使用提供的脚本测试SSE连接:

    npm run test:sse
    

    或者手动使用curl:

    curl -N http://localhost:8081/sse
    

    f.验证防火墙设置是否允许连接到端口8081

  6. 连接后,检查器将显示所有可用工具,并允许您以交互方式对其进行测试。

⚠️ 备注:使用MCP检查器时,您必须使用完整的URL,包括 http:// 前缀。

MCP客户端集成

在Claude Desktop中安装

  1. 将服务器配置添加到位于以下位置的Claude Desktop配置文件中:
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • 窗户: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "singlestore": {
      "command": "node",
      "args": ["path/to/mcp-server-singlestore/build/index.js"],
      "env": {
        "SINGLESTORE_HOST": "your-host.singlestore.com",
        "SINGLESTORE_PORT": "3306",
        "SINGLESTORE_USER": "your-username",
        "SINGLESTORE_PASSWORD": "your-password",
        "SINGLESTORE_DATABASE": "your-database",
        "SSE_ENABLED": "true",
        "SSE_PORT": "3333"
      }
    }
  }
}

SSE_ENABLED和SSE_PORT变量是可选的。如果您想在标准MCP协议的同时启用支持SSE的HTTP服务器,请将它们包括在内。

  1. 重新启动Claude桌面应用程序

  2. 在与Claude的对话中,您现在可以使用SingleStore MCP服务器:

use_mcp_tool({
  server_name: "singlestore",
  tool_name: "list_tables",
  arguments: {}
})

在Windsurf中安装

  1. 将服务器配置添加到位于以下位置的Windsurf配置文件中:
    • macOS: ~/Library/Application Support/Windsurf/config.json
    • 窗户: %APPDATA%\Windsurf\config.json
{
  "mcpServers": {
    "singlestore": {
      "command": "node",
      "args": ["path/to/mcp-server-singlestore/build/index.js"],
      "env": {
        "SINGLESTORE_HOST": "your-host.singlestore.com",
        "SINGLESTORE_PORT": "3306",
        "SINGLESTORE_USER": "your-username",
        "SINGLESTORE_PASSWORD": "your-password",
        "SINGLESTORE_DATABASE": "your-database",
        "SSE_ENABLED": "true",
        "SSE_PORT": "3333"
      }
    }
  }
}

SSE_ENABLED和SSE_PORT变量是可选的,但可以通过SSE HTTP服务器启用其他功能。

  1. 重新启动Windsurf

  2. 在Windsurf中与Claude的对话中,当Claude需要访问数据库信息时,SingleStore MCP工具将自动可用。

在Cursor中安装

  1. 将服务器配置添加到游标设置中:
    • 打开的游标
    • 前往设置(齿轮图标)>扩展>Claude AI>MCP服务器
    • 添加具有以下配置的新MCP服务器:
{
  "singlestore": {
    "command": "node",
    "args": ["path/to/mcp-server-singlestore/build/index.js"],
    "env": {
      "SINGLESTORE_HOST": "your-host.singlestore.com",
      "SINGLESTORE_PORT": "3306",
      "SINGLESTORE_USER": "your-username",
      "SINGLESTORE_PASSWORD": "your-password",
      "SINGLESTORE_DATABASE": "your-database",
      "SSE_ENABLED": "true",
      "SSE_PORT": "3333"
    }
  }
}

SSE_ENABLED和SSE_PORT变量允许web应用程序通过HTTP连接到服务器,并通过服务器发送事件接收实时更新。

  1. 重新启动游标

  2. 在Cursor中使用Claude AI时,SingleStore MCP工具将可用于数据库操作。

安全考虑

  1. 从不将凭据提交到版本控制
  2. 使用环境变量或安全配置管理
  3. 考虑将连接池机制用于生产环境
  4. 在SingleStore中实施适当的访问控制和用户权限
  5. 保持SingleStore CA捆绑包最新

发展

项目结构

mcp-server-singlestore/
├── src/
│   └── index.ts      # Main server implementation
├── package.json
├── tsconfig.json
├── README.md
└── CHANGELOG.md

建筑

npm run build

测试

npm test

故障排除

  1. 连接问题

    • 验证环境变量中的凭据和主机信息
    • 检查SSL配置
    • 确保数据库可以从您的网络访问
    • 检查防火墙设置,以允许出站连接到SingleStore数据库
  2. 构建问题

    • 清除node_modules并重新安装依赖项
    • 验证TypeScript配置
    • 检查Node.js版本兼容性(应为16+)
  3. MCP集成问题

    • 验证客户端配置中服务器build/index.js文件的路径是否正确
    • 检查客户端配置中是否正确设置了所有环境变量
    • 更改配置后重新启动客户端应用程序
    • 检查客户端日志中是否有与MCP服务器相关的任何错误消息
    • 首先尝试独立运行服务器,以验证它在客户端之外是否正常工作

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 提交您的更改
  4. 推到分支
  5. 创建拉取请求

许可证

MIT许可证-有关详细信息,请参阅许可证文件