Read Only Local Postgres Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Read Only Local Postgres Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server that enables Claude Desktop to interact with PostgreSQL databases through natural language queries.
claude mcp add postgres -s user -- npx -y @hovecapital/read-only-postgres-mcp-serverThen set your database environment variables:
export DB_HOST=localhost
export DB_PORT=5432
export DB_DATABASE=your_database_name
export DB_USERNAME=your_username
export DB_PASSWORD=your_passwordDone! Restart Claude Code and ask: "What tables are in my database?"
1. Open your config file:
# macOS
open ~/Library/Application\ Support/Claude/claude_desktop_config.json
# Windows
notepad %APPDATA%\Claude\claude_desktop_config.json2. Add this configuration:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@hovecapital/read-only-postgres-mcp-server"],
"env": {
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_DATABASE": "your_database_name",
"DB_USERNAME": "your_username",
"DB_PASSWORD": "your_password"
}
}
}
}3. Save, restart Claude Desktop, and test!
This server is published in the Model Context Protocol Registry as capital.hove/read-only-local-postgres-mcp-server.
#### Method A: Claude Code CLI (Easiest!)
claude mcp add postgres -s user -- npx -y @hovecapital/read-only-postgres-mcp-serverThen configure your database credentials using environment variables. Restart Claude Code and you're done!
Benefits:
#### Method B: Manual JSON Configuration
For Claude Desktop:
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@hovecapital/read-only-postgres-mcp-server"],
"env": {
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_DATABASE": "your_database_name",
"DB_USERNAME": "your_username",
"DB_PASSWORD": "your_password"
}
}
}
}For Claude Code:
Edit ~/.config/claude-code/settings.json (macOS/Linux) or %APPDATA%\claude-code\settings.json (Windows):
{
"mcp": {
"servers": {
"postgres": {
"command": "npx",
"args": ["-y", "@hovecapital/read-only-postgres-mcp-server"],
"env": {
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_DATABASE": "your_database_name",
"DB_USERNAME": "your_username",
"DB_PASSWORD": "your_password"
}
}
}
}
}npm install -g @hovecapital/read-only-postgres-mcp-serverIf you're using Claude Code, you can easily install this MCP server:
# Clone the repository
git clone https://github.com/hovecapital/read-only-local-postgres-mcp-server.git
cd read-only-local-postgres-mcp-server
# Install dependencies and build
npm install
npm run buildThen configure Claude Code by adding to your MCP settings.
#### 1. Clone or Download
Save the repository to a directory on your system:
mkdir ~/mcp-servers/postgres
cd ~/mcp-servers/postgres
git clone https://github.com/hovecapital/read-only-local-postgres-mcp-server.git .#### 2. Install Dependencies
npm install
npm run buildNote: If you installed via Option 1 (MCP Registry with npx), you've already configured everything! This section is for users who chose Options 2, 3, or 4 (npm or manual installation).
If you're using Claude Code with a manual installation, add the PostgreSQL server to your MCP settings:
~/.config/claude-code/settings.json on macOS/Linux or %APPDATA%\claude-code\settings.json on Windows){
"mcp": {
"servers": {
"postgres": {
"command": "node",
"args": ["/absolute/path/to/read-only-local-postgres-mcp-server/dist/index.js"],
"env": {
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_DATABASE": "your_database_name",
"DB_USERNAME": "your_username",
"DB_PASSWORD": "your_password"
}
}
}
}
}If you're using Claude Desktop with a manual installation, open your Claude Desktop configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonAdd the PostgreSQL server configuration:
{
"mcpServers": {
"postgres": {
"command": "node",
"args": ["/absolute/path/to/read-only-local-postgres-mcp-server/dist/index.js"],
"env": {
"DB_HOST": "localhost",
"DB_PORT": "5432",
"DB_DATABASE": "your_database_name",
"DB_USERNAME": "your_username",
"DB_PASSWORD": "your_password"
}
}
}
}If you're using mise for Node.js version management, make sure to use the full path to the Node.js executable in your configuration.
| Variable | Description | Default |
|---|---|---|
DB_HOST | PostgreSQL server hostname | localhost |
DB_PORT | PostgreSQL server port | 5432 |
DB_DATABASE | Database name | postgres |
DB_USERNAME | PostgreSQL username | postgres |
DB_PASSWORD | PostgreSQL password | (empty) |
DB_SSL | Enable SSL connection | false |
This MCP server exposes three tools that Claude can use to interact with PostgreSQL databases.
connectConnect to a PostgreSQL database using a connection string. The connection persists for subsequent queries until changed or disconnected.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
connectionString | string | Yes | PostgreSQL connection string |
Connection String Format:
postgres://username:password@host:port/database?sslmode=require
postgresql://username:password@host:port/databaseSSL Modes Supported:
sslmode=require - Require SSL (recommended for remote connections)sslmode=verify-full - Require SSL with certificate verificationExample Usage (natural language):
"Connect to postgres://myuser:[email protected]:5432/production"
"Connect to this database: postgres://admin:secret@localhost/analytics"Response:
{
"status": "connected",
"host": "db.example.com",
"port": 5432,
"database": "production",
"user": "myuser",
"ssl": true
}disconnectDisconnect from the current runtime database and revert to the default environment-configured connection.
Parameters: None
Example Usage (natural language):
"Disconnect from the current database"
"Go back to the default database"Response:
{
"status": "disconnected",
"message": "Reverted to default environment connection",
"host": "localhost",
"database": "postgres"
}queryRun a read-only SQL query against the currently connected database. Optionally override the connection for a single query.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
sql | string | Yes | SQL query to execute (SELECT only) |
connectionString | string | No | Override connection for this query only |
Example Usage (natural language):
"Show me all tables in the database"
"SELECT * FROM users LIMIT 10"
"Run this query on postgres://other:pass@host/db: SELECT count(*) FROM orders"Response:
[
{ "id": 1, "name": "Alice", "email": "[email protected]" },
{ "id": 2, "name": "Bob", "email": "[email protected]" }
]When using this MCP server, Claude can:
User: "What tables are in my database?"
Claude: [Uses query tool with SQL: "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"] User: "Connect to postgres://user:pass@newhost/newdb and show me the users table"
Claude: [Uses connect tool first, then query tool] User: "How many records are in the orders table on postgres://user:pass@analytics/warehouse?"
Claude: [Uses query tool with connectionString parameter] User: "Go back to my local database"
Claude: [Uses disconnect tool]Basic queries (uses default/active connection):
"Show me all tables in my database"
"What's the structure of the users table?"
"Get the first 10 records from the products table"
"How many orders were placed last month?"
"Show me users with email addresses ending in @gmail.com"Dynamic connection examples:
"Connect to postgres://analyst:[email protected]:5432/warehouse"
"Now show me all the tables"
"What's the total revenue in the sales table?"
"Disconnect and go back to my local database"One-off queries to different databases:
"Run SELECT count(*) FROM users on postgres://admin:[email protected]/app"
"Check the orders table on my staging database: postgres://dev:dev@staging/app"Claude will automatically convert your natural language requests into appropriate SQL queries and execute them against your database.
The server enforces read-only access on all connections (both environment-configured and runtime dynamic connections). The following operations are blocked:
INSERT - Adding new recordsUPDATE - Modifying existing recordsDELETE - Removing recordsDROP - Removing tables/databasesALTER - Modifying table structureCREATE - Creating new tables/databasesTRUNCATE - Removing all records from a tableGRANT - Modifying permissionsREVOKE - Removing permissionsWhen using the connect tool or connectionString parameter:
connect tool response excludes passwordsFor enhanced security, create a dedicated read-only user for the MCP server:
-- Create a read-only user
CREATE USER claude_readonly WITH PASSWORD 'secure_password';
-- Grant only SELECT permissions on your specific schema
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
-- Grant permissions for future tables (optional)
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO claude_readonly;dist/index.js is correctclaude_desktop_config.json formatTo see server logs, you can run the server manually:
node dist/index.js~/mcp-servers/postgres/
├── src/
│ └── index.ts
├── dist/
│ ├── index.js
│ └── index.d.ts
├── package.json
├── tsconfig.json
└── node_modules/Feel free to submit issues and enhancement requests!
This project is open source and available under the MIT License.
If you encounter issues:
Note: This server is designed for development and analysis purposes. For production use, consider additional security measures and monitoring.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.