数据库查询服务器

一个基于Go语言开发的数据库查询服务器,支持PostgreSQL数据库的查询和管理。

  • by PawelK2012
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 PawelK2012/database-query-server

使用说明

数据库查询服务器

示例MCP服务器-Go(数据库查询服务器)-根据这些构建 规格

如何运行项目

  1. 简单的开始 docker compose up -相关 文档
  2. 使用命令启动MPC服务器 make run
  3. 你可以使用Go MCP客户端,其中包括 tools/call 示例

配置

.env

在部署此设置之前,您需要在中配置以下值 .env 文件。

  • POSTGRES_USER
  • POSTGRES_PW
  • POSTGRES_DB(可以是默认值)
  • PG管理员默认电子邮件
  • PGADMIN_DEFAULT_PASSWORD

使用docker compose进行部署

部署此设置时,pgAdmin web界面将在端口5050处可用(例如。http://localhost:5050).

$ docker compose up
Starting postgres ... done
Starting pgadmin ... done

将postgres数据库添加到pgAdmin

使用.env文件的凭据登录后,您可以将数据库添加到pgAdmin。

  1. 右键单击左上角的“服务器”,然后选择“创建”->“服务器…”
  2. 命名您的连接
  3. 切换到“连接”选项卡并添加连接详细信息:
  • 主机名:“postgres”(这通常是您的postgres数据库的IP地址-但是,docker可以通过其名称解析此容器的IP)
  • 端口:“5432”
  • 维护数据库:$POSTGRES_DB(请参阅.env)
  • 用户名:$POSTGRES_USER(请参阅.env)
  • 密码:$POSTGRES_PW(请参阅.env)

预期结果

检查容器是否正在运行:

$ docker ps
CONTAINER ID   IMAGE                           COMMAND                  CREATED             STATUS                 PORTS                                                                                  NAMES
849c5f48f784   postgres:latest                 "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes           0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                              postgres
d3cde3b455ee   dpage/pgadmin4:latest           "/entrypoint.sh"         9 minutes ago       Up 9 minutes           443/tcp, 0.0.0.0:5050->80/tcp, :::5050->80/tcp                                         pgadmin

用以下方式停止容器

$ docker compose down
# To delete all data run:
$ docker compose down -v

使用示例

执行一个简单的SELECT查询

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "execute_query",
    "arguments": {
      "database": "primary",
      "query": "SELECT id, name, email FROM users WHERE active = $1",
      "parameters": {"1": true},
      "format": "json",
      "limit": 100
    }
  }
}

安全执行准备好的报表

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "execute_prepared",
    "arguments": {
      "database": "primary",
      "StatementName": "SELECT id, name, email FROM users WHERE active = $1",
      "parameters": {"1": true},
      "format": "json"
    }
  }
}

执行一个简单的SELECT查询

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "execute_query",
    "arguments": {
      "database": "primary",
      "query": "SELECT id, name, email FROM users WHERE active = $1",
      "parameters": {"1": true},
      "format": "json",
      "limit": 100
    }
  }
}

获取表架构

echo '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call", 
  "params": {
    "name": "get_schema",
    "arguments": {
      "database": "primary",
      "tables": ["users", "orders"],
      "detailed": true
    }
  }
}' 

获取连接状态

echo '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call", 
  "params": {
    "name": "get_connection_status",
    "arguments": {
      "database": "primary"//name of the DB you want to retrieve stats for
    }
  }
}' 

示例用法

# Basic JSON-RPC request
curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "MCP-Protocol-Version: 2024-11-05" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
    "name": "execute_query",
    "arguments": {
      "database": "primary",
      "query": "SELECT id, name, email FROM users WHERE active = $1",
      "parameters": {"1": true},
      "format": "json",
      "limit": 100
    }
  }
  }'

初始化

curl -v -X POST http://localhost:8080/mcp \
   -H "Content-Type: application/json" \
   -d '{
     "jsonrpc": "2.0",
     "id": 1,
     "method": "initialize",
     "params": {
       "protocolVersion": "2025-03-26",
       "capabilities": {
         "tools": {},
         "resources": {},
         "prompts": {}
       },
       "clientInfo": {
         "name": "curl-client",
         "version": "1.0"
       }
     }
   }'

用测试数据填充数据库

进步

通过使用以下SQL查询调用此MCP服务器,您可以轻松地用测试数据填充PostgreSQL数据库:

  1. 创建 Customers 桌子
CREATE TABLE IF NOT EXISTS Customers (
		id SERIAL PRIMARY KEY,
		CustomerName VARCHAR(200),
		ContactName VARCHAR(250),
		Address VARCHAR(500),
		City VARCHAR(250),
		PostalCode VARCHAR(150),
		Country VARCHAR(250),
		created_at TIMESTAMP
	)
  1. 用数据更新表格
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
			VALUES
			('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway'),
			('Greasy Burger', 'Per Olsen', 'Gateveien 15', 'Sandnes', '4306', 'Norway'),
			('Tasty Tee', 'Finn Egan', 'Streetroad 19B', 'Liverpool', 'L1 0AA', 'UK');
  1. 查询数据库
SELECT * FROM customers

或者(别忘了提供所需的参数)

SELECT CustomerName, Address FROM customers WHERE Country =$1 AND City LIKE $2

示例

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "execute_query",
    "arguments": {
      "database": "primary",
      "query": "SELECT CustomerName, Address FROM customers WHERE Country =$1 AND City LIKE $2",
      "parameters": {"1": "UK", "2": "L%"},
      "format": "json",
      "limit": 100
    }
  }
}