数据库查询服务

BD MCP Server是一个基于Node.js和TypeScript的MySQL只读数据库查询服务,通过MCP协议提供安全的SELECT/SHOW/DESCRIBE查询、表列表和表结构描述功能。

  • by Juand4rck12
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Juand4rck12/mcp-pos-server

使用说明

BD MCP 服务器

MCP服务器(模型上下文协议 - Anthropic)用于数据库——提供工具,以便从MCP代理/客户端以只读模式查询MySQL数据库。该项目使用Node.js + TypeScript构建,并使用pnpm进行管理。

摘要

这个仓库包含一个MCP服务器的实现,它:

  • 展示用于以下目的的工具:
    • 执行安全的SELECT/SHOW/DESCRIBE查询。
    • 列出表格。
    • 描述表结构。
  • 美国 mysql2/promise 带有连接池。
  • 应用安全限制:
    • 仅允许阅读查询。
    • 预防写作中的关键词(或:避免在写作中使用特定关键词)。
    • 添加 LIMIT 仅在SELECT中不使用 LIMIT。
  • 向stderr记录日志并支持DEBUG(DEBUG=true)。

要求

  • Node.js 版本 >= 18
  • pnpm(注:pnpm是一个包管理器,全称为Performance Packager Manager,中文可译为“高性能包管理器”,但在此处直接保留原英文形式以指代其特定名称)
  • 从运行服务器的主机访问MySQL

环境变量

设置以下变量(示例 .env 文件未包含在仓库中):

建议创建具有只读权限的用户:

-- Conecta como root a MySQL
CREATE USER 'mcp_readonly_user'@'localhost' IDENTIFIED BY 'passmcp_readonly_password';

-- Otorga SOLO permisos de lectura
GRANT SELECT, SHOW VIEW ON your_database(s).* TO 'mcp_readonly_user'@'localhost';

-- Aplica los cambios
FLUSH PRIVILEGES;
  • MYSQL_HOST(默认:localhost)
  • MYSQL_PORT(默认:3306)
  • MYSQL_USER(MySQL用户名)
  • MYSQL_PASSWORD(MySQL密码)
  • MYSQL_DATABASE 翻译为中文是“MySQL 数据库”
  • 调试(可选, true 用于调试日志 (DEBUG)

Windows PowerShell 示例:

$env:MYSQL_HOST="db.example.com"
$env:MYSQL_USER="developer"
$env:MYSQL_PASSWORD="secret"
$env:MYSQL_DATABASE="mcp_pos"
$env:DEBUG="true"

安装

使用 pnpm:

pnpm install

编译 TypeScript:

pnpm build

执行

开发模式(如果已配置,则直接使用ts-node)或使用构建:

使用构建:

pnpm build
node dist/index.js

日志和输出:

  • 所有的日志都将输出到标准错误(stderr)。MCP 协议通过标准输入/标准输出(stdio 传输)进行通信。

展示的工具(tools)

  • 列出表(或“表列表”)

    • 输入:{}
    • 输出:配置模式的表列表。
  • 描述表

    • 输入:{ 表名: 字符串 }
    • 输出:表的架构/列。
  • 查询位置数据库(或查询工具)

    • 输入:{ sql: 字符串, params?: 任意数组 }
    • 限制:仅限 SELECT/SHOW/DESCRIBE。 LIMIT 100 它仅添加到没有 LIMIT 的 SELECT 中。
    • 输出:返回的行数、计数和执行时间。

使用示例(MCP有效载荷)

列出表格:

{
  "tool": "list_tables",
  "input": {}
}

描述表格:

{
  "tool": "describe_table",
  "input": { "tableName": "users" }
}

执行 SELECT:

{
  "tool": "query_pos_database",
  "input": { "sql": "SELECT id, name FROM users WHERE active = 1", "params": [] }
}

注:通话必须遵守您客户端/代理所使用的MCP协议。

故障排除

  • 在添加 LIMIT 时附近出现 SQL 语法错误:'LIMIT 100' SHOW/DESCRIBE解决方案:现在服务器只添加 LIMIT 一个没有 LIMIT 子句的 SELECT 语句。
  • 连接被拒绝:请检查凭据以及主机/端口是否可访问。
  • 如果表格未显示:请检查是否 MYSQL_DATABASE 指向正确的模式。

贡献

分支(Fork)-> 功能分支(feature branch)-> 向(目标)提交拉取请求(PR hacia) dev -> 审查 -> 合并到 main. 按照PR(构建、手动测试、环境变量配置)的检查清单进行。

许可证

麻省理工学院(MIT)