hybrid server
The server is able to function both locally and remotely, depending on the configuration or use case.
Integrations
Enables querying Parquet files through DuckDB, providing data analysis capabilities on structured files
Allows reading and querying Parquet files stored in Google Cloud Storage buckets
Provides tools for executing SQL queries against PostgreSQL databases, including SELECT, CREATE/INSERT, UPDATE, and DELETE operations
MCP 数据库服务器
使用mcp-framework
构建的模型上下文协议 (MCP) 服务器,提供与数据库(通过 DuckDB 的 PostgreSQL)和 Google Cloud Storage(GCS)交互的工具和资源。
先决条件
- Node.js 22 或更高版本
- TypeScript
- PostgreSQL(数据库功能所需)
- Google Cloud 凭据(可选,用于 GCS 功能)
- Devbox (使用
make
命令进行本地开发)
项目结构
安装
- 克隆存储库:Copy
- 安装依赖项(建议使用 Devbox 以确保一致性):Copy
- 将
.env.example
复制到.env
并填写您的环境变量。Copy - 构建项目:Copy
配置
环境变量
使用这些环境变量(或命令行参数)配置服务器:
DATABASE_URL
:PostgreSQL 连接字符串(除非使用超级网关运行,否则是必需的)。DATABASE_URLS
:用于多个数据库连接的alias=url
对的逗号分隔列表(DATABASE_URL
的替代)。LOG_LEVEL
:日志级别(debug
、info
、error
)。默认值:info
。GCS_BUCKET
:默认 Google Cloud Storage 存储桶名称(可选)。GCP_SERVICE_ACCOUNT
:Base64 编码的 Google Cloud 服务帐户密钥 JSON(可选,用于 GCS 身份验证)。GCS_KEY_ID
/GCS_SECRET
:专门用于 DuckDB 的httpfs
扩展的替代 GCS 凭证(可选)。TRANSPORT
:传输类型(stdio
或sse
)。默认值:stdio
。PORT
:SSE 传输的端口号。默认值:3001
。HOST
:SSE 传输的主机名。默认值:localhost
。API_KEY
:用于保护服务器的可选 API 密钥(如果设置,客户端必须在Authorization: Bearer <key>
标头中提供它)。
命令行参数(例如--port 8080
、 --gcs-bucket my-bucket
)会覆盖环境变量。详情请参阅src/config.ts
。
数据库迁移
该项目使用node-pg-migrate
来管理 PostgreSQL 数据库架构变更。有关运行和创建迁移的详细信息,请参阅上文原始 README 文件中的“数据库迁移”部分。
**注意:**前面提到的npm run setup:db
命令可能需要根据当前设置进行审查或更新。
运行服务器
使用Makefile
进行便捷的开发命令(需要 Devbox):
不使用make
运行(在npm run build
之后):
客户端配置
要将您的 MCP 客户端(例如mcp-cli
、Claude Desktop)连接到本地服务器:
对于 SSE 传输(例如,在端口 3001 上):
(注意:上一个 README 中的 Docker/supergateway 示例可能已过时或特定于不同的部署设置。)
对于 Stdio 传输:
使用 GitHub 上的 npx 运行
您可以使用 npx 直接运行服务器(需要包中的构建步骤):
可用工具
duckdb_insert
:通过 DuckDB 在附加的 PostgreSQL 数据库上执行INSERT
语句。仅允许INSERT
查询。duckdb_query
:使用 DuckDB 的postgres_query
函数直接在连接的 PostgreSQL 数据库 (postgres_db
) 上执行只读 SQL 查询。会自动为非限定表名添加前缀(例如,my_table
变为postgres_db.public.my_table
)。duckdb_read_parquet
:使用 DuckDB 查询 Parquet 文件(如果配置的话,可能从 GCS 查询)。gcs_directory_tree
:从支持分页的 GCS 存储桶中获取目录树结构。
可用资源
mcp://gcs/objects
(gcs_objects
):列出配置的 GCS 存储桶中的对象。mcp://db/tables
(sql_tables
):列出配置的 PostgreSQL 数据库中的所有表及其列。
开发:整合新工具/资源
本项目使用mcp-framework
。要添加新工具或资源,请执行以下操作:
- 创建类:
- 在
src/tools/
或src/resources/
中创建一个新的.ts
文件。 - 定义一个扩展
MCPTool
或MCPResource
类。 - 实现所需的属性(工具的
name
、description
、schema
)和方法(工具的execute
、资源的read
)。 - 在
schema
属性中使用 Zod 进行输入验证(工具)。 - 初始化类中的任何依赖项(如 DB 连接或 GCS 客户端),通常在构造函数中,可能使用来自
src/services/
服务或来自src/config.ts
的配置。
示例工具(
src/tools/my_tool.ts
):Copy - 在
- 自动发现:
mcp-framework
自动发现并注册从src/tools
和src/resources
目录中的文件默认导出的工具/资源类。- 确保您的新类是其文件中的
default export
。
- 测试:
- 运行服务器(
make dev
)。 - 检查启动日志以确保列出了您的新工具/资源。
- 使用 MCP 客户端(如
mcp-cli
或 MCP Inspector)调用该工具或读取资源并验证其功能。
- 运行服务器(
最佳实践
- 使用 Zod 为工具定义清晰的输入模式。
- 在
execute
/read
过程中优雅地处理错误,并使用formatErrorResponse
返回格式化的错误响应(或抛出错误)。 - 在需要的地方通过
getConfig()
使用集中配置(src/config.ts
)。 - 利用
src/services/
中的服务初始化程序来实现数据库连接等依赖项。 - 添加日志记录(
console.error
)以提高可见性。
This server cannot be installed
模型上下文协议服务器提供与数据库交互的工具,包括 PostgreSQL、DuckDB 和 Google Cloud Storage Parquet 文件。