项目简介
MariaDB MCP 服务端是一个基于Model Context Protocol (MCP) 的后端应用,旨在帮助大型语言模型(LLM)客户端与MariaDB数据库进行无缝交互。它以标准化的方式提供数据库的上下文信息和操作能力,包括执行SQL查询、管理数据库及表格结构,并可选地支持向量存储和语义搜索功能,从而赋能AI助理进行智能数据处理。
主要功能点
- 数据库信息查询: 列出所有可访问的数据库及其包含的表格。
- 表格结构获取: 获取指定表格的详细结构(字段、类型、键、关联关系等)。
- 安全SQL执行: 执行只读的SQL查询(如SELECT、SHOW、DESCRIBE),支持参数化查询以提高安全性。
- 数据库创建: 创建新的数据库(如果不存在)。
- 向量存储管理 (可选): 在MariaDB中创建、删除和列出向量存储(表格),用于存储和管理嵌入数据。
- 文档嵌入与搜索 (可选): 将文档及其元数据批量插入向量存储,并根据用户查询进行语义搜索,找到最相似的文档。
- 多模型支持 (可选): 集成OpenAI、Google Gemini或HuggingFace等多种嵌入模型,生成高质量的向量嵌入。
- 灵活的传输协议: 支持Stdio、SSE (Server-Sent Events) 和HTTP等多种通信方式。
安装步骤
-
克隆仓库:
git clone https://github.com/MariaDB/mcp.git cd mcp -
安装 'uv' (Python 依赖管理器):
pip install uv -
安装项目依赖:
uv pip compile pyproject.toml -o uv.lock uv pip sync uv.lock -
配置环境变量: 在项目根目录创建 '.env' 文件,并根据您的MariaDB数据库和嵌入服务配置信息进行填写。
示例 '.env' 文件 (带嵌入支持,推荐):
DB_HOST=localhost DB_USER=your_mariadb_user DB_PASSWORD=your_mariadb_password DB_PORT=3306 DB_NAME=your_default_database # 可选,连接后可切换 MCP_READ_ONLY=true # 建议设为true以限制AI写入操作 MCP_MAX_POOL_SIZE=10 EMBEDDING_PROVIDER=openai # 或 gemini / huggingface OPENAI_API_KEY=sk-... # 如果使用OpenAI,请填写您的API密钥 # GEMINI_API_KEY=AI... # 如果使用Gemini,请填写您的API密钥 # HF_MODEL="BAAI/bge-m3" # 如果使用HuggingFace,请填写模型名称- 请确保MariaDB服务器已运行,并可通过配置的'DB_HOST'、'DB_PORT'、'DB_USER'、'DB_PASSWORD'访问。
- 根据选择的'EMBEDDING_PROVIDER',提供相应的API密钥或模型名称。如不需嵌入功能,可删除'EMBEDDING_PROVIDER'及相关行。
服务器配置 (用于MCP客户端)
MCP客户端(如Claude桌面版、Cursor、Windsurf)需要配置MCP服务器的启动信息。以下是JSON格式的配置示例及参数说明:
1. 使用标准输入/输出 (stdio) 方式: 这种方式适用于客户端直接启动并管理MCP服务器进程。
{ "mcpServers": { "MariaDB_Server": { "command": "uv", "args": [ "--directory", "path/to/your/mcp-mariadb-server-repo/", // 替换为您的MCP仓库实际路径 "run", "server.py" ], "envFile": "path/to/your/mcp-mariadb-server-repo/.env", // 替换为您的.env文件实际路径 "description": "连接MariaDB数据库,提供SQL查询和向量搜索工具。" // 可选,描述此服务器用途 } } }
- 'command': 执行服务器的命令,通常是Python环境的启动器(如'uv'或'python')。
- 'args': 启动命令的参数列表。
- '--directory': 指定项目根目录。
- 'run': 'uv'的子命令,用于执行Python脚本。
- 'server.py': 服务器的主脚本文件。
- 'envFile': 指定包含数据库凭据和API密钥的'.env'文件路径。
- 'description': 自定义服务器描述,方便客户端识别。
2. 使用SSE (Server-Sent Events) 传输方式: 服务器作为HTTP服务运行,客户端通过HTTP URL连接。 首先,在终端启动服务器:
python server.py --transport sse --host 127.0.0.1 --port 9001
然后,在MCP客户端中配置:
{ "servers": { "mariadb-mcp-server-sse": { "url": "http://127.0.0.1:9001/sse", // 替换为您的服务器实际地址和端口 "type": "sse", "description": "通过SSE协议连接MariaDB MCP服务器。" } } }
- 'url': MCP服务器的SSE接口URL。
- 'type': 传输类型,此处为'sse'。
3. 使用HTTP (Streamable HTTP) 传输方式: 服务器作为HTTP服务运行,客户端通过HTTP URL连接。 首先,在终端启动服务器:
python server.py --transport http --host 127.0.0.1 --port 9001 --path /mcp
然后,在MCP客户端中配置:
{ "servers": { "mariadb-mcp-server-http": { "url": "http://127.0.0.1:9001/mcp", // 替换为您的服务器实际地址、端口和路径 "type": "streamable-http", "description": "通过HTTP协议连接MariaDB MCP服务器。" } } }
- 'url': MCP服务器的HTTP接口URL。
- 'type': 传输类型,此处为'streamable-http'。
基本使用方法 (通过MCP客户端调用工具)
一旦MCP客户端连接成功,LLM就可以通过JSON-RPC调用服务器暴露的工具。
1. 列出所有数据库: 调用工具:'list_databases',无参数。 例如 (客户端内部调用):
{ "tool": "list_databases", "parameters": {} }
2. 执行一个只读SQL查询: 调用工具:'execute_sql'。 参数:
- 'database_name': 目标数据库名称 (字符串)
- 'sql_query': SQL查询语句 (字符串)
- 'parameters': SQL查询的参数列表 (可选,列表) 例如 (客户端内部调用):
{ "tool": "execute_sql", "parameters": { "database_name": "your_database", "sql_query": "SELECT id, name FROM users WHERE age > %s", "parameters": [30] } }
3. 创建一个向量存储: 调用工具:'create_vector_store' (需要启用嵌入功能)。 参数:
- 'database_name': 目标数据库名称 (字符串)
- 'vector_store_name': 向量存储的表格名称 (字符串)
- 'model_name': 用于生成嵌入的模型名称 (可选,字符串)
- 'distance_function': 向量距离计算函数,'cosine' 或 'euclidean' (可选,字符串,默认为'cosine') 例如 (客户端内部调用):
{ "tool": "create_vector_store", "parameters": { "database_name": "ai_data", "vector_store_name": "product_descriptions", "model_name": "text-embedding-3-small", "distance_function": "cosine" } }
4. 插入文档到向量存储: 调用工具:'insert_docs_vector_store' (需要启用嵌入功能)。 参数:
- 'database_name': 目标数据库名称 (字符串)
- 'vector_store_name': 向量存储的表格名称 (字符串)
- 'documents': 要插入的文档列表 (字符串列表)
- 'metadata': 与每个文档关联的元数据列表 (可选,字典列表) 例如 (客户端内部调用):
{ "tool": "insert_docs_vector_store", "parameters": { "database_name": "ai_data", "vector_store_name": "product_descriptions", "documents": ["高性能笔记本电脑", "超薄智能手机"], "metadata": [{"category": "electronics"}, {"category": "mobile"}] } }
5. 语义搜索向量存储: 调用工具:'search_vector_store' (需要启用嵌入功能)。 参数:
- 'database_name': 目标数据库名称 (字符串)
- 'vector_store_name': 向量存储的表格名称 (字符串)
- 'user_query': 用户的查询语句 (字符串)
- 'k': 返回最相似文档的数量 (可选,整数,默认为7) 例如 (客户端内部调用):
{ "tool": "search_vector_store", "parameters": { "database_name": "ai_data", "vector_store_name": "product_descriptions", "user_query": "寻找适合出差的轻便设备", "k": 3 } }
信息
分类
数据库与文件