返回市场
数据库_mcp_服务器

数据库_mcp_服务器

作者:georgi-terziyski3 星标更新:2025-03-18

项目介绍

数据库MCP服务器

一个提供工具连接并操作各种数据库系统的模型上下文协议(MCP)服务器。

特性

  • 多数据库支持:连接到SQLite、PostgreSQL、MySQL/MariaDB和SQL Server数据库
  • 统一接口:在所有支持的数据库类型中提供通用的数据库操作工具
  • 特定数据库扩展:根据需要,提供特定于数据库特性的工具
  • 模式管理:创建、修改和删除表及索引
  • 查询执行:执行原始SQL查询或使用结构化查询工具
  • 事务支持:开始、提交和回滚事务

安装

预备条件

  • Python 3.8 或更高版本
  • 所需Python包(通过pip自动安装):
    • SQLAlchemy
    • 根据要使用的数据库,不同的数据库驱动程序:
      • SQLite(随Python自带)
      • PostgreSQL: psycopg2-binary
      • MySQL/MariaDB: mysql-connector-python
      • SQL Server: pyodbc

从源码安装

# 克隆仓库
git clone <repository-url>

# 安装包
pip install -e .

配置

服务器可以通过环境变量、配置文件或运行时提供的连接详情进行配置。

环境变量

  • DB_CONFIG_PATH:指向JSON配置文件的路径
  • DB_CONNECTIONS:连接ID的逗号分隔列表或包含连接详情的JSON字符串

配置文件格式

{
  "connections": {
    "sqlite_conn": {
      "type": "sqlite",
      "db_path": "/path/to/database.db"
    },
    "postgres_conn": {
      "type": "postgres",
      "host": "localhost",
      "port": 25432,
      "database": "mydatabase",
      "user": "myuser",
      "password": "mypassword"
    }
  }
}

使用方法

运行服务器

作为Claude的MCP服务器

# 使用默认设置运行
python -m db_mcp_server

# 指定配置文件
python -m db_mcp_server --config /path/to/config.json

# 设置日志级别
python -m db_mcp_server --log-level DEBUG

作为独立的Web服务器(适用于任何LLM)

# 以Web服务器形式运行
python -m db_mcp_server.web_server

# 指定主机和端口
python -m db_mcp_server.web_server --host 0.0.0.0 --port 8000

# 指定配置文件和日志级别
python -m db_mcp_server.web_server --config /path/to/config.json --log-level DEBUG

可用的MCP工具

连接管理

  • add_connection:添加新的数据库连接
  • test_connection:测试数据库连接
  • list_connections:列出所有数据库连接
  • remove_connection:移除数据库连接

查询执行

  • execute_query:执行SQL查询
  • get_records:获取表中的记录
  • insert_record:向表中插入记录
  • update_record:更新表中的记录
  • delete_record:删除表中的记录

模式管理

  • list_tables:列出数据库中的所有表
  • get_table_schema:获取表的模式
  • create_table:创建新表
  • drop_table:删除表
  • create_index:在表上创建索引
  • drop_index:删除索引
  • alter_table:修改表结构

事务管理

  • begin_transaction:开始事务
  • commit_transaction:提交事务
  • rollback_transaction:回滚事务

示例

添加连接

{
  "connection_id": "my_sqlite_db",
  "type": "sqlite",
  "db_path": "/path/to/database.db"
}

执行查询

{
  "connection_id": "my_sqlite_db",
  "query": "SELECT * FROM users WHERE age > ?",
  "params": [21]
}

创建表

{
  "connection_id": "my_sqlite_db",
  "table": "users",
  "columns": [
    {
      "name": "id",
      "type": "INTEGER",
      "primary_key": true,
      "nullable": false
    },
    {
      "name": "name",
      "type": "TEXT",
      "nullable": false
    },
    {
      "name": "email",
      "type": "TEXT",
      "nullable": true
    }
  ]
}

插入记录

{
  "connection_id": "my_sqlite_db",
  "table": "users",
  "data": {
    "name": "John Doe",
    "email": "john@example.com"
  }
}

开发

运行测试

# 运行所有测试
python -m unittest discover

# 运行特定测试文件
python -m unittest tests.test_sqlite

从其他LLM连接

当作为独立的Web服务器运行时,其他LLM(如Llama 3)可以通过HTTP连接到数据库MCP服务器。服务器暴露以下端点:

端点

  • /list_tools - GET或POST:返回所有可用工具及其描述和输入模式的列表
  • /call_tool - POST:执行特定的数据库工具

示例:从另一个LLM调用

要使用此服务器与另一个LLM,让LLM生成对服务器的HTTP请求。这里是一个如何为像Llama 3这样的LLM构建提示的例子:

你可以通过向位于http://localhost:8000的数据库服务发送HTTP请求来与数据库交互。
该服务提供了以下端点:

1. 要获取可用工具列表:
   发送一个POST请求到:http://localhost:8000/list_tools
   
2. 要执行数据库工具:
   发送一个POST请求到:http://localhost:8000/call_tool
   带有如下JSON主体:
   {
     "name": "tool_name",
     "arguments": {
       "param1": "value1",
       "param2": "value2"
     }
   }

例如,要执行一个SQL查询,你会发送如下请求:
POST http://localhost:8000/call_tool
Content-Type: application/json

{
  "name": "execute_query",
  "arguments": {
    "connection_id": "my_db",
    "query": "SELECT * FROM users"
  }
}

客户端集成的示例Python代码

import requests
import json

# 数据库MCP服务器的基本URL
BASE_URL = "http://localhost:8000"

# 列出可用工具
def list_tools():
    response = requests.post(f"{BASE_URL}/list_tools")
    return response.json()

# 执行数据库工具
def call_tool(tool_name, arguments):
    payload = {
        "name": tool_name,
        "arguments": arguments
    }
    response = requests.post(f"{BASE_URL}/call_tool", json=payload)
    return response.json()

# 示例:列出数据库中的表
def list_tables(connection_id):
    return call_tool("list_tables", {"connection_id": connection_id})

# 示例:执行SQL查询
def execute_query(connection_id, query, params=None):
    return call_tool("execute_query", {
        "connection_id": connection_id,
        "query": query,
        "params": params
    })

# 示例:添加新的连接
def add_connection(connection_id, db_type, **kwargs):
    args = {"connection_id": connection_id, "type": db_type}
    args.update(kwargs)
    return call_tool("add_connection", args)

许可证

MIT许可证 </中文翻译>