Skip to main content
Glama
sbfulfil

PostgreSQL MCP Server

by sbfulfil
README.md
# PostgreSQL MCP Server

A Model Context Protocol (MCP) server that provides access to PostgreSQL database schemas and metadata. This server allows Cursor and other MCP-compatible tools to explore your database structure, inspect table schemas, and understand relationships.

## Features

- **List Tables**: Get all tables in a schema with basic information
- **Describe Table**: Get detailed column information for any table
- **Table Relationships**: Explore foreign key relationships
- **List Schemas**: See all available schemas in your database
- **Index Information**: View indexes for specific tables

## Prerequisites

- Node.js 18+ 
- PostgreSQL database (local or remote)
- npm or yarn package manager

## Installation

1. **Clone or download this repository**

2. **Install dependencies**:
   ```bash
   npm install
   ```

3. **Configure database connection**:
   ```bash
   cp config.env.example .env
   ```
   
   Edit the `.env` file with your PostgreSQL connection details:
   ```env
   DB_HOST=localhost
   DB_PORT=5432
   DB_NAME=your_database_name
   DB_USER=your_username
   DB_PASSWORD=your_password
   ```

4. **Test the server** (optional):
   ```bash
   npm start
   ```

## Cursor Integration

To use this MCP server with Cursor, you need to add it to your Cursor configuration.

### Step 1: Add to Cursor MCP Configuration

Open Cursor and go to Settings → Features → Model Context Protocol, or edit your MCP configuration file directly.

Add the following configuration:

```json
{
  "mcpServers": {
    "postgres-schema": {
      "command": "node",
      "args": ["/absolute/path/to/pg_mcp/src/index.js"],
      "env": {
        "DB_HOST": "localhost",
        "DB_PORT": "5432", 
        "DB_NAME": "your_database_name",
        "DB_USER": "your_username",
        "DB_PASSWORD": "your_password"
      }
    }
  }
}
```

**Important**: Replace `/absolute/path/to/pg_mcp/src/index.js` with the actual absolute path to your `src/index.js` file.

### Step 2: Alternative Configuration (Using .env file)

If you prefer to use the `.env` file for configuration:

```json
{
  "mcpServers": {
    "postgres-schema": {
      "command": "node",
      "args": ["/absolute/path/to/pg_mcp/src/index.js"],
      "cwd": "/absolute/path/to/pg_mcp"
    }
  }
}
```

### Step 3: Restart Cursor

After adding the configuration, restart Cursor to load the MCP server.

## Available Tools

Once configured, you'll have access to these tools in Cursor:

### `list_tables`
Lists all tables in a specified schema (defaults to 'public')
```
Parameters:
- schema (optional): Schema name (default: "public")
```

### `describe_table` 
Gets detailed schema information for a specific table
```
Parameters:
- table_name (required): Name of the table to describe
- schema (optional): Schema name (default: "public")
```

### `get_table_relationships`
Shows foreign key relationships for a table
```
Parameters:
- table_name (required): Name of the table
- schema (optional): Schema name (default: "public")
```

### `list_schemas`
Lists all available schemas in the database
```
No parameters required
```

### `get_indexes`
Shows indexes for a specific table
```
Parameters:
- table_name (required): Name of the table
- schema (optional): Schema name (default: "public")
```

## Usage Examples

Once configured in Cursor, you can ask questions like:

- "What tables are in my database?"
- "Show me the schema for the users table"
- "What are the foreign key relationships for the orders table?"
- "List all indexes on the products table"
- "What schemas are available in my database?"

## Troubleshooting

### Connection Issues

1. **Database connection fails**: 
   - Verify your database credentials in `.env`
   - Ensure PostgreSQL is running
   - Check if the database allows connections from your host

2. **MCP server not loading in Cursor**:
   - Verify the absolute path to `index.js` is correct
   - Check that Node.js is installed and accessible
   - Review Cursor's MCP logs for error messages

3. **Permission denied errors**:
   - Ensure the database user has read permissions on `information_schema`
   - Grant necessary SELECT permissions on system tables

### Common Error Messages

- `Database connection failed`: Check your connection parameters
- `Table not found`: Verify the table name and schema
- `Permission denied`: Ensure your database user has appropriate read permissions

## Security Considerations

- This server only reads database metadata (schema information)
- No actual table data is accessed or exposed
- Uses parameterized queries to prevent SQL injection
- Database credentials are stored locally in your environment

## Development

To run in development mode with auto-reload:
```bash
npm run dev
```

## License

MIT License - see LICENSE file for details. 

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation5/5

Every tool has a clearly distinct purpose targeting different aspects of PostgreSQL metadata. describe_table focuses on schema details, get_indexes on indexing, get_table_relationships on foreign keys, and list_schemas/list_tables on database structure overviews. There is no overlap or ambiguity between these functions.

Naming Consistency5/5

All tools follow a consistent verb_noun naming pattern (describe_table, get_indexes, get_table_relationships, list_schemas, list_tables). The verbs are appropriate and descriptive, and the snake_case convention is maintained throughout without deviation.

Tool Count4/5

Five tools is a reasonable number for a PostgreSQL metadata server, providing essential introspection capabilities. It is slightly lean but covers core needs like schema listing, table exploration, and relationship mapping, though it could potentially benefit from additional tools for views or constraints.

Completeness3/5

The toolset covers read-only metadata operations well, but there are notable gaps for a full PostgreSQL MCP server. It lacks tools for query execution, data manipulation (INSERT/UPDATE/DELETE), or administrative tasks like user management, which limits its utility for broader database interactions.

Maintenance

ActivityInactive
ResponsivenessNo issues