使用说明
MCP PostgreSQL演示
FastMCP服务器,使LLM能够连接PostgreSQL数据库并与之交互。这个项目演示了如何使用模型上下文协议(MCP)来允许语言模型查询和探索数据库模式和表。
特性
- 模式探索:检索有关数据库架构的元数据
- 台板检验:获取有关表结构的详细信息
- 数据库查询:对数据库执行SQL查询
- YAML格式:结果以YAML格式返回,便于LLM使用
资源
服务器公开以下MCP资源:
database://{schema}-获取架构中所有表的信息database://{schema}/tables/{table}-获取特定表格的详细信息
工具
query_database-对数据库执行SQL查询(仅限SELECT查询)
提示
服务器包括以下预定义提示:
prompt_schema_description-请求数据库模式的描述prompt_table_description-要求提供特定表格的描述prompt_query_database-从特定表中请求数据
先决条件
- Python 3.12或更高版本
- PostgreSQL数据库
- UV包管理器(推荐)
安装
-
克隆存储库:
git clone <repository-url> cd mcp-demo -
创建虚拟环境:
python -m venv .venv source .venv/bin/activate # On Windows: .venv\Scripts\activate -
安装UV(如果尚未安装):
pip install uv -
使用UV安装依赖项:
uv sync -
配置环境变量:
- 复制
.env.example向.env - 根据PostgreSQL配置更新值
- 复制
配置
使用环境变量配置应用程序:
| 变量 | 描述 | 默认值 |
|---|---|---|
| APP_NAME | 应用程序名称 | mcp演示 |
| DB_HOST | PostgreSQL主机 | 本地主机 |
| DB_PORT | PostgreSQL端口 | 5432 |
| DB_USER | PostgreSQL用户名 | postgres |
| DB_PASSWORD | PostgreSQL密码 | postgres |
| DB_NAME | PostgreSQL数据库名称 | postgres |
用法
-
首先,取消注释run函数
src/main.py通过删除文件底部这些行中的注释:# if __name__ == "__main__": # print("Starting FastMCP server...") # mcp.run() -
启动FastMCP服务器:
python -m src.main -
该服务器将可供LLM连接并查询您的PostgreSQL数据库。随着服务器的运行,MCP可以加载到客户端应用程序中进行交互。
客户端配置
要在客户端应用程序中使用此MCP,请将以下配置添加到客户端的MCP配置文件中(例如。, .cursor/mcp.json):
{
"mcpServers": {
"postgres-mcp-server": {
"command": "/path/to/your/venv/bin/mcp",
"args": ["run", "/path/to/your/postgres-mcp/src/main.py"],
"env": {
"APP_NAME": "mcp-demo",
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_USER": "postgres",
"DB_PASSWORD": "postgres",
"DB_NAME": "postgres"
}
}
}
}
确保用虚拟环境和项目目录的实际路径替换路径,并更新环境变量以匹配PostgreSQL配置。
发展
使用UV安装开发依赖项:
uv pip install -e ".[dev]"
开发工具包括:
- JupyterLab笔记本电脑
- 用于型式检验的Pyright
- 绒布
码头工人
使用Docker运行应用程序:
-
构建Docker镜像:
docker build -t mcp-demo . -
运行容器:
docker run --env-file .env.docker -p 8000:8000 mcp-demo
示例用法
获取架构信息
from mcp.client import get_client
client = get_client("http://localhost:8000")
schema_info = client.get_resource("database://public")
print(schema_info)
获取表格详细信息
table_info = client.get_resource("database://public/tables/users")
print(table_info)
执行查询
result = client.invoke_tool("query_database", {"query": "SELECT * FROM users LIMIT 10"})
print(result)
许可证
[在此处添加您的许可证信息]
贡献者
- 里卡多·桑托斯 ricardo.santos.diaz@gmail.com