Mcp Db Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Db 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 href="https://mcpindex.ai/server/io-github-souhar-dya-mcp-db-server"><img src="https://mcpindex.ai/api/v1/badge/io-github-souhar-dya-mcp-db-server" alt="mcpindex verdict" height="20" /></a>
An MCP (Model Context Protocol) server that exposes relational databases (PostgreSQL/MySQL) to AI agents with natural language query support. Transform natural language questions into SQL queries and get structured results.
X-API-Key authentication for all database HTTP endpoints; /health remains public for health checks.127.0.0.1.sslmode=require compatibility for asyncpg connections.souhardyak/mcp-db-server:1.4.0souhardyak/mcp-db-server:latestghcr.io/souhar-dya/mcp-db-server:1.4.0ghcr.io/souhar-dya/mcp-db-server:latest| Endpoint | Method | Description |
|---|---|---|
/health | GET | Health check and service status |
/mcp/list_tables | GET | List all available tables with column counts |
/mcp/describe/{table_name} | GET | Get detailed schema for a specific table |
/mcp/query | POST | Execute natural language queries |
/mcp/tables/{table_name}/sample | GET | Get sample data from a table |
git clone https://github.com/Souhar-dya/mcp-db-server.git
cd mcp-db-server
export MCP_API_KEY="$(openssl rand -hex 32)"
docker-compose up --build # Health check
curl http://localhost:8000/health
# List tables (requires the configured API key)
curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/list_tables
# Describe a table
curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/describe/customers
# Natural language query
curl -X POST "http://localhost:8000/mcp/query" \
-H "X-API-Key: $MCP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show top 5 customers by total orders"}' pip install -r requirements.txt export DATABASE_URL="postgresql+asyncpg://user:password@localhost:5432/dbname"
export MCP_API_KEY="$(openssl rand -hex 32)"
# or for MySQL:
# export DATABASE_URL="mysql+pymysql://user:password@localhost:3306/dbname" python -m app.serverThe project includes a sample database with realistic e-commerce data:
The server can understand various types of natural language queries:
# Get all customers
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show all customers"}'
# Count orders by status
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "count orders by status"}'
# Top customers by order value
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "top 5 customers by total order amount"}'
# Recent orders
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show recent orders from last week"}'| Variable | Description | Default |
|---|---|---|
DATABASE_URL | Full database connection URL | postgresql+asyncpg://postgres:postgres@localhost:5432/postgres |
DB_HOST | Database host | localhost |
DB_PORT | Database port | 5432 |
DB_USER | Database username | postgres |
DB_PASSWORD | Database password | postgres |
DB_NAME | Database name | postgres |
HOST | Server host | 127.0.0.1 |
PORT | Server port | 8000 |
MCP_API_KEY | Required API key for database HTTP routes | Not set (API disabled) |
CORS_ALLOW_ORIGINS | Comma-separated allowed browser origins | Empty (disabled) |
# PostgreSQL
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/mydb
# MySQL
DATABASE_URL=mysql+pymysql://user:pass@localhost:3306/mydb
# PostgreSQL with SSL
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/mydb?sslmode=require
### Database Connection Examples
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname
DATABASE_URL=mysql+aiomysql://user:password@host:3306/dbname
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname?sslmode=require
DATABASE_URL=mysql+aiomysql://user:password@host:3306/dbname?ssl-mode=REQUIRED
> **Note:**
> - For MySQL cloud providers, the `ssl-mode` parameter in the URL is ignored by the driver, but SSL is always enabled in the MCP server for cloud connections.
> - For PostgreSQL, use `sslmode=require` for cloud DBs. For MySQL, just use the standard URL; SSL is handled automatically.
> - If you see errors about `ssl-mode` or `sslmode`, check your URL and ensure you are using the correct driver prefix (`mysql+aiomysql` or `postgresql+asyncpg`).
#### Cloud Database Examples
DATABASE_URL=postgresql+asyncpg://username:[email protected]/dbname
DATABASE_URL=mysql+aiomysql://avnadmin:[email protected]:11079/defaultdb?ssl-mode=REQUIRED
#### Docker Usage with Cloud DB
docker run -d \ -p 8000:8000 \ -e DATABASE_URL="<your_cloud_database_url>" \ -e MCP_API_KEY="<your_random_api_key>" \ souhardyak/mcp-db-server:latest
GitHub Container Registry is also available:
docker login ghcr.io docker pull ghcr.io/souhar-dya/mcp-db-server:latest docker run -d \ -p 8000:8000 \ -e DATABASE_URL="<your_database_url>" \ -e MCP_API_KEY="$MCP_API_KEY" \ ghcr.io/souhar-dya/mcp-db-server:latest
Images are published automatically when a `v*.*.*` tag is pushed. The workflow also creates the matching GitHub Release. To publish an existing tag such as `v1.4.0`, open the workflow's **Run workflow** action and enter `1.4.0`. Set the GHCR package visibility to **Public** in the repository's **Packages** settings if unauthenticated pulls should be allowed.
#### Troubleshooting
- If you get `connect() got an unexpected keyword argument 'ssl-mode'`, ignore it: SSL is still enabled.
- For network errors, check firewall and DB credentials.
- For MySQL, always use `mysql+aiomysql` in the URL for async support.For PostgreSQL cloud providers, use an asyncpg URL and sslmode=require:
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname?sslmode=requireThe server normalizes sslmode=require to the ssl option expected by asyncpg. A temporary PostgreSQL verification was completed successfully against a compatible cloud database using CREATE, INSERT, SELECT, UPDATE, DELETE, and DROP; no test data was retained. Never commit or share a connection URL containing a real password.
MCP_API_KEY is a secret that you generate and provide to the server. It protects all database HTTP endpoints through the X-API-Key request header. The /health endpoint remains public for container health checks.
Generate a strong key on Linux or macOS:
export MCP_API_KEY="$(openssl rand -hex 32)"Generate one in Windows PowerShell:
$bytes = New-Object byte[] 32
[Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
$env:MCP_API_KEY = ([BitConverter]::ToString($bytes) -replace "-", "").ToLower()Start the Docker image with the key:
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="<your_database_url>" \
-e MCP_API_KEY="$MCP_API_KEY" \
souhardyak/mcp-db-server:latestCall a protected endpoint with the same key:
curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/list_tablesKeep the key in a password manager or deployment secret store. Do not commit it to Git, put it in a public image, or include it in logs.
X-API-Key; /health remains public for health checks127.0.0.1 unless explicitly configured otherwisemcp-db-server/
├── app/
│ ├── __init__.py # Package initialization
│ ├── server.py # FastAPI application and endpoints
│ ├── db.py # Database connection and operations
│ └── nl_to_sql.py # Natural language to SQL conversion
├── .github/workflows/
│ └── docker-publish.yml # CI/CD pipeline
├── docker-compose.yml # Docker Compose configuration
├── Dockerfile # Container definition
├── init_db.sql # Sample database schema and data
├── requirements.txt # Python dependencies
└── README.md # This fileThis server is designed to work seamlessly with MCP-compatible AI agents:
/docsVS Code MCP gallery uses MCP Registry metadata. This repository now includes server.json for registry publication.
docker build -t souhardyak/mcp-db-server:1.3.1 .
docker push souhardyak/mcp-db-server:1.3.1server.json is configured for an OCI package and stdio transport:
name: io.github.Souhar-dya/mcp-db-serverregistryType: ociidentifier: docker.io/souhardyak/mcp-db-server:1.3.1The Dockerfile includes registry ownership annotation:
io.modelcontextprotocol.server.name=io.github.Souhar-dya/mcp-db-serverInstall publisher and publish metadata:
mcp-publisher login github
mcp-publisher publishAfter publishing, users can discover/install it from MCP-compatible clients, including VS Code MCP experiences that read from the registry.
{
"servers": {
"mcp-db-server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"DATABASE_URL=sqlite+aiosqlite:////data/default.db",
"souhardyak/mcp-db-server:1.3.1"
]
}
}
}Use the dedicated Docker smoke test in tests/docker:
python tests/docker/smoke_test.pyThis verifies Docker daemon access, image build, container startup, and health status.
# Pull the latest image
docker pull souhardyak/mcp-db-server:latest
# Run with your database
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="your_database_url_here" \
souhardyak/mcp-db-server:latestapiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-db-server
spec:
replicas: 3
selector:
matchLabels:
app: mcp-db-server
template:
metadata:
labels:
app: mcp-db-server
spec:
containers:
- name: mcp-db-server
image: souhardyak/mcp-db-server:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
---
apiVersion: v1
kind: Service
metadata:
name: mcp-db-server-service
spec:
selector:
app: mcp-db-server
ports:
- port: 80
targetPort: 8000
type: LoadBalancer# Start test database
docker-compose up postgres -d
# Wait for database to be ready
sleep 10
# Run tests
python -m pytest tests/ -v# Test health endpoint
curl http://localhost:8000/health
# Test table listing
curl http://localhost:8000/mcp/list_tables
# Test natural language query
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show me all customers from California"}'git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
from db import DatabaseManager to failmcp_server.py now uses robust path resolution that works both locally and in Docker containersCould not locate column in row for column 'column_name' error with MySQL databasesdescribe_table method to use index-based row access for better SQLAlchemy compatibilitystr can't be used in 'await' expression error in MCP server⭐ If this project helped you, please consider giving it a star!
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.