Skip to content

Commit e641e18

Browse files
Adds multiple database connection support
Enables the application to connect to multiple databases using the `--db` command-line argument. Validates the database connection names and URLs. Supports setting database connections via environment variables, with environment variables taking precedence over command-line arguments. For backwards compatibility, continues to support a default `DATABASE_URI` from a positional argument.
1 parent 045b0e4 commit e641e18

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

src/postgres_mcp/server.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import asyncio
44
import logging
55
import os
6+
import re
67
import signal
78
import sys
89
from enum import Enum
@@ -595,6 +596,12 @@ async def main():
595596
default=8000,
596597
help="Port for SSE server (default: 8000)",
597598
)
599+
parser.add_argument(
600+
"--db",
601+
action="append",
602+
metavar="NAME=URL",
603+
help="Database connection (can be repeated): --db prod=postgresql://... --db staging=postgresql://...",
604+
)
598605

599606
args = parser.parse_args()
600607

@@ -614,7 +621,30 @@ async def main():
614621
# For backwards compatibility, support command-line database_url argument
615622
if args.database_url and "DATABASE_URI" not in os.environ:
616623
os.environ["DATABASE_URI"] = args.database_url
617-
logger.info("Using command-line database URL as DATABASE_URI")
624+
logger.info("Set default database connection from positional argument")
625+
626+
# Process --db arguments with validation
627+
if args.db:
628+
for db_spec in args.db:
629+
if "=" not in db_spec:
630+
logger.error(f"Invalid --db format: '{db_spec}'. Expected NAME=URL")
631+
sys.exit(1)
632+
633+
name, url = db_spec.split("=", 1)
634+
name = name.strip().upper()
635+
636+
# Validate name contains only alphanumeric and underscore
637+
if not re.match(r"^[A-Z0-9_]+$", name):
638+
logger.error(f"Invalid connection name '{name}'. Only alphanumeric characters and underscores allowed.")
639+
sys.exit(1)
640+
641+
# Check if already set in environment (env vars take precedence)
642+
env_var = f"DATABASE_URI_{name}" if name != "DEFAULT" else "DATABASE_URI"
643+
if env_var in os.environ:
644+
logger.info(f"Skipping --db {name}=... (already set via {env_var} environment variable)")
645+
else:
646+
os.environ[env_var] = url
647+
logger.info(f"Set database connection '{name.lower()}' from command-line argument")
618648

619649
try:
620650
await connection_registry.discover_and_connect()

0 commit comments

Comments
 (0)