Skip to main content
Glama
melihbirim

PostgreSQL MCP Server

by melihbirim
README.md
# PostgreSQL MCP Server

A Model Context Protocol (MCP) server that enables AI assistants to interact with PostgreSQL databases using natural language queries. This server provides secure, read-only access to database schemas and allows for natural language to SQL translation.

## Features

- šŸ”’ **Secure**: Read-only operations only (SELECT, SHOW, DESCRIBE, EXPLAIN, WITH)
- šŸ—„ļø **Schema Inspection**: List tables, describe structures, view relationships
- šŸ” **Query Execution**: Execute SQL queries with safety checks and result limits
- 🌐 **Natural Language**: Enables AI assistants to convert natural language to SQL
- ⚔ **Fast**: Built with TypeScript and the official MCP SDK

## Available Tools

### Database Connection
- `connect_database` - Connect to a PostgreSQL database
- `disconnect_database` - Disconnect from the current database

### Schema Inspection
- `list_tables` - List all tables in the current database
- `describe_table` - Get detailed information about a table's structure
- `get_schema` - Get an overview of the database schema and relationships

### Query Execution
- `execute_query` - Execute read-only SQL queries with safety checks

## Quick Test with Docker

### 1. Start Test Database
```bash
npm run docker:up
```

### 2. Run Tests
```bash
npm run test
```

### 3. Try Manual Testing
```bash
npm run test:manual
```

### 4. Clean Up
```bash
npm run docker:down
```

## Installation

### Prerequisites
- Node.js 16 or higher
- PostgreSQL database access
- Claude for Desktop (for testing with AI assistant)

### Setup

1. **Clone and build**:
   ```bash
   git clone https://github.com/melihbirim/pg-mcp.git
   cd pg-mcp
   npm install
   npm run build
   ```

2. **Configure Claude for Desktop**:
   Edit your Claude configuration file:
   ```bash
   # macOS
   code ~/Library/Application\ Support/Claude/claude_desktop_config.json
   
   # Windows
   code %APPDATA%\\Claude\\claude_desktop_config.json
   ```

3. **Add server configuration**:
   ```json
   {
     "mcpServers": {
       "postgresql": {
         "command": "node",
         "args": ["/ABSOLUTE/PATH/TO/pg-mcp/build/index.js"]
       }
     }
   }
   ```

4. **Restart Claude for Desktop**

## Usage Examples

Once connected to Claude for Desktop, you can use natural language to query your database:

### Connect to Database
"Connect to my PostgreSQL database named 'inventory' on localhost with username 'admin'"

### Schema Exploration
- "What tables are in this database?"
- "Describe the users table structure"
- "Show me the database schema"

### Natural Language Queries
- "How many users are in the system?"
- "Show me all products with price greater than $100"
- "What are the top 5 customers by order count?"
- "Find all orders placed in the last 30 days"

## Security Features

- **Read-only operations**: Only SELECT, SHOW, DESCRIBE, EXPLAIN, and WITH statements allowed
- **Query validation**: Automatic checking for dangerous operations
- **Result limits**: Automatic LIMIT clauses added to prevent large result sets
- **Error handling**: Secure error messages without exposing sensitive information

## Development

### Project Structure
```
pg-mcp/
ā”œā”€ā”€ src/
│   └── index.ts          # Main MCP server implementation
ā”œā”€ā”€ build/                # Compiled JavaScript output
ā”œā”€ā”€ .github/
│   └── copilot-instructions.md
ā”œā”€ā”€ .vscode/
│   └── mcp.json          # VS Code MCP configuration
ā”œā”€ā”€ package.json
ā”œā”€ā”€ tsconfig.json
└── README.md
```

### Building
```bash
npm run build
```

### Running Locally
```bash
npm run dev
```

### Testing
The server communicates via stdio, so you can test it by running:
```bash
echo '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": {"name": "test", "version": "1.0.0"}}}' | node build/index.js
```

## Environment Variables

You can optionally set these environment variables:
- `PG_HOST` - PostgreSQL host (default: localhost)
- `PG_PORT` - PostgreSQL port (default: 5432)
- `PG_DATABASE` - Default database name
- `PG_USER` - Default username
- `PG_PASSWORD` - Default password

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request

## License

ISC License

## Troubleshooting

### Claude for Desktop Issues
- Check Claude's logs: `~/Library/Logs/Claude/mcp*.log`
- Ensure absolute paths in configuration
- Restart Claude for Desktop after config changes

### Database Connection Issues
- Verify PostgreSQL is running
- Check connection credentials
- Ensure network access to database host

### Permission Issues
```bash
chmod +x build/index.js
```

TDQS

A3.5/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: connect/disconnect manage connections, list_tables enumerates tables, describe_table provides table details, get_schema shows relationships, and execute_query runs read-only SQL. An agent can easily distinguish between these functions.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case naming (e.g., connect_database, describe_table, execute_query). The naming is predictable and readable throughout the set.

Tool Count4/5

With 6 tools, the count is reasonable for a PostgreSQL server focused on schema exploration and read-only queries. It's slightly lean but covers core database interaction needs without bloat.

Completeness3/5

The tools cover connection management, schema inspection, and read-only queries well, but there are notable gaps: no write operations (INSERT, UPDATE, DELETE) or administrative functions (e.g., create/drop tables). This limits the server to read-only use cases, which may cause agent failures for broader database tasks.

Maintenance

ActivityInactive
ResponsivenessNo issues