pg-mcp
Enables MCP-compatible clients to interact with PostgreSQL databases with multi-database support and connection pooling.
README
pg-mcp
PostgreSQL MCP (Model Context Protocol) server with multi-database support. This tool allows you to interact with PostgreSQL databases through MCP-compatible clients like Cursor, Claude, and other AI-powered development tools.
Features
- Multi-database support with configuration management
- Connection pooling with automatic cleanup
- Auto-reload configuration on file changes
- Backward compatibility with single database setups
- Secure credential handling
Installation
To install dependencies:
bun install
To run:
bun run src/index.ts
Configuration
Configuration Path
The configuration file location is determined by the PG_MCP_CONFIG_PATH environment variable. If not set, it defaults to:
$HOME/.config/pg-mcp/config.json
You can set a custom configuration path:
export PG_MCP_CONFIG_PATH="/path/to/your/config.json"
Configuration Schema
The configuration file follows this JSON schema:
{
"databases": {
"database_name": {
"url": "postgresql://user:password@host:port/database",
"ttl": 60000
}
},
"autoReload": true
}
Fields:
databases: Object containing database configurationsdatabase_name: Unique identifier for the databaseurl: PostgreSQL connection URL (required)ttl: Time-to-live for connection pooling in milliseconds (default: 60000)
autoReload: Enable automatic configuration reloading when the file changes (default: false)
Configuration Example
{
"databases": {
"default": {
"url": "postgresql://user:password@localhost:5432/myapp",
"ttl": 60000
},
"analytics": {
"url": "postgresql://user:password@analytics-host:5432/analytics",
"ttl": 120000
}
},
"autoReload": true
}
Migration from POSTGRES_URL
If no configuration file exists but the POSTGRES_URL environment variable is set, pg-mcp will automatically create a default configuration with a single database entry named "default".
Available Tools
pg-mcp provides comprehensive tools for database management and interaction, organized into three categories: configuration management, database querying, and utility functions.
Database Configuration Management Tools
Tools for managing database configurations and connection pooling.
pg_db_list
Description: List all configured databases with their connection details and TTL settings.
Parameters: None
Returns: Array of database configurations with redacted credentials
Example:
{
"name": "pg_db_list"
}
Response Example:
{
"result": [
{
"name": "default",
"url": "postgresql://user:***@localhost:5432/myapp",
"ttl": 60000
},
{
"name": "analytics",
"url": "postgresql://user:***@analytics-host:5432/analytics",
"ttl": 120000
}
]
}
pg_db_add
Description: Add a new database configuration to the connection pool.
Parameters:
name(string, required): Unique identifier for the databaseurl(string, required): PostgreSQL connection URL (must be valid URL format)ttl(number, optional): Time-to-live for connections in milliseconds (default: 60000)
Returns: Confirmation with the added database configuration (credentials redacted)
Example:
{
"name": "pg_db_add",
"arguments": {
"name": "production",
"url": "postgresql://user:password@prod-host:5432/myapp",
"ttl": 30000
}
}
pg_db_update
Description: Update an existing database configuration. You can update the URL, TTL, or both.
Parameters:
name(string, required): Identifier of the database to updateurl(string, optional): New PostgreSQL connection URLttl(number, optional): New TTL value in milliseconds
Returns: Confirmation with updated configuration
Example:
{
"name": "pg_db_update",
"arguments": {
"name": "production",
"ttl": 45000
}
}
pg_db_remove
Description: Remove a database configuration and close its connection pool.
Parameters:
name(string, required): Identifier of the database to remove
Returns: Confirmation of removal
Example:
{
"name": "pg_db_remove",
"arguments": {
"name": "staging"
}
}
pg_db_reload
Description: Reload the database configuration from disk and reconcile the connection pool. Useful after manual configuration file changes or to refresh stale configurations.
Parameters: None
Returns: List of all configured database names after reload
Example:
{
"name": "pg_db_reload"
}
Database Query Tools
Tools for querying and inspecting PostgreSQL databases. All tools support an optional database parameter to select which database to query.
Note on Database Selection:
- When only one database is configured, the
databaseparameter is optional and automatically uses that database- When multiple databases are configured, you must specify the
databaseparameter- If neither condition is met, an error will indicate which databases are available
pg_get_server_version
Description: Retrieve the PostgreSQL server version and detailed version information.
Parameters:
database(string, optional): Name of the database to connect to
Returns: PostgreSQL version information
Example:
{
"name": "pg_get_server_version",
"arguments": {
"database": "production"
}
}
get_url
Description: Retrieve the connection URL for a specific database (with credentials redacted for security).
Parameters:
database(string, optional): Name of the database
Returns: Redacted PostgreSQL connection URL
Example:
{
"name": "get_url",
"arguments": {
"database": "default"
}
}
pg_list_schemas
Description: List all schemas available in the selected database.
Parameters:
database(string, optional): Name of the database to query
Returns: Array of schema names
Example:
{
"name": "pg_list_schemas",
"arguments": {
"database": "production"
}
}
Response Example:
{
"result": ["public", "auth", "api", "analytics"]
}
pg_list_tables
Description: List all tables in a specific schema of the selected database.
Parameters:
schema(string, required): Name of the schema to querydatabase(string, optional): Name of the database to query
Returns: Array of table names in the specified schema
Example:
{
"name": "pg_list_tables",
"arguments": {
"schema": "public",
"database": "production"
}
}
Response Example:
{
"result": ["users", "posts", "comments", "categories"]
}
pg_describe_table
Description: Get detailed information about a specific table, including columns, data types, nullability, defaults, and foreign key constraints.
Parameters:
schema(string, required): Name of the schema containing the tabletable(string, required): Name of the table to describedatabase(string, optional): Name of the database to query
Returns: Comprehensive table structure with columns and foreign key relationships
Example:
{
"name": "pg_describe_table",
"arguments": {
"schema": "public",
"table": "users",
"database": "production"
}
}
Response Example:
{
"result": {
"schema_name": "public",
"table_name": "users",
"columns": [
{
"column_name": "id",
"data_type": "integer",
"is_nullable": false,
"column_default": "nextval('users_id_seq'::regclass)"
},
{
"column_name": "email",
"data_type": "character varying",
"is_nullable": false,
"column_default": null
}
],
"foreign_keys": [
{
"constraint_name": "posts_user_id_fk",
"column_name": "id",
"referenced_table_schema": "public",
"referenced_table_name": "posts",
"referenced_column_name": "user_id"
}
]
}
}
pg_execute_query
Description: Execute a read-only SQL query against the selected database. Queries are restricted to SELECT operations for security.
Parameters:
query(string, required): SQL SELECT query to executedatabase(string, optional): Name of the database to query against
Returns: Query results as JSON array
Example:
{
"name": "pg_execute_query",
"arguments": {
"query": "SELECT * FROM users WHERE created_at > NOW() - INTERVAL '7 days' LIMIT 10",
"database": "production"
}
}
Response Example:
{
"result": [
{
"id": 1,
"email": "user@example.com",
"created_at": "2024-10-22T10:30:00Z"
},
{
"id": 2,
"email": "another@example.com",
"created_at": "2024-10-23T15:45:00Z"
}
]
}
Utility Functions
gen_types (Prompt)
Description: Generate TypeScript type definitions for specified tables. This is an interactive prompt that uses other tools to gather table information.
Parameters:
schema(string, optional): Schema name containing the tablestables(string, optional): Comma-separated list of table names
Returns: TypeScript type definitions based on table structures
Example Usage:
To generate TypeScript types for the users and posts tables in the public schema, use:
schema: public
tables: users, posts
Complete Workflow Examples
Example 1: Explore a Single Database
When you have only one database configured, you can omit the database parameter:
[
{ "name": "pg_list_schemas" },
{ "name": "pg_list_tables", "arguments": { "schema": "public" } },
{
"name": "pg_describe_table",
"arguments": { "schema": "public", "table": "users" }
}
]
Example 2: Work with Multiple Databases
When multiple databases are configured, always specify which one to use:
[
{ "name": "pg_db_list" },
{
"name": "pg_get_server_version",
"arguments": { "database": "production" }
},
{ "name": "pg_list_schemas", "arguments": { "database": "production" } },
{
"name": "pg_execute_query",
"arguments": {
"database": "analytics",
"query": "SELECT COUNT(*) FROM events"
}
}
]
Example 3: Add and Configure a New Database
[
{
"name": "pg_db_add",
"arguments": {
"name": "staging",
"url": "postgresql://user:password@staging-host:5432/app",
"ttl": 45000
}
},
{ "name": "pg_db_list" },
{ "name": "pg_get_server_version", "arguments": { "database": "staging" } }
]
Example 4: Query Multiple Databases
[
{
"name": "pg_execute_query",
"arguments": {
"database": "production",
"query": "SELECT COUNT(*) as user_count FROM users"
}
},
{
"name": "pg_execute_query",
"arguments": {
"database": "analytics",
"query": "SELECT COUNT(*) as event_count FROM events"
}
}
]
Connection Pooling
pg-mcp uses a lazy connection pool to manage database connections efficiently:
- Connections are created on-demand when a tool is called
- Connections are tracked with last-used timestamps
- Idle connections are automatically closed based on their TTL
- An idle reaper runs periodically to clean up stale connections
- Pool is automatically reconciled when configuration changes
Auto-Reload
When autoReload is set to true in the configuration, pg-mcp will automatically reload the configuration file when changes are detected. This allows you to add, remove, or modify database configurations without restarting the server.
Building
To build the project for distribution:
bun run build
To compile a standalone executable:
bun run compile
This project was created using bun init in bun v1.2.15. Bun is a fast all-in-one JavaScript runtime.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.