That default is the reason to prefer this over the upstream image, and it pairs naturally with a read-only database user — belt and braces on the same connection. The one setup detail that catches people is stdio mode: without the console-logging switches, Quarkus writes to the same stream the protocol uses.
A fork of the Quarkus MCP JDBC server that adds two things: a published Docker image so you do not build anything, and a safety default where INSERT, UPDATE and DELETE are disabled until you switch them on.
- Database access over JDBC for an assistant — inspecting, querying, and, when enabled, modifying content
- Any database with a JDBC driver the upstream project supports, selected purely by the connection URL
- Write operations off by default behind a single `enable.write.sql` setting
- Two transports from the same image: an SSE endpoint at /mcp/sse, or stdio for local clients
- Configuration entirely through environment variables, so credentials come from an env file rather than a config file in the repo
- Docker Compose examples for both the SSE service and the stdio client setup
Docker, and a reachable database with its JDBC connection URL. Set `jdbc.url`, and `jdbc.user` and `jdbc.password` where the database needs them; leave `enable.write.sql` false unless you mean it. For SSE, publish port 8080 and connect to /mcp/sse. For stdio you must also pass `quarkus.mcp.server.stdio.enabled=true` together with the two console-logging settings that silence stdout, and run the container with `-i` — otherwise log output corrupts the protocol stream. Apache licensed.
One command plus a key — docker run --rm -e enable.write.sql=false -e jdbc.user=db_user -e jdbc.password=db_password -e jdbc.url=jdbc:postgresql://host:port/database -e quarkus.mcp.server.stdio.enabled=true -e quarkus.log.console.enable=false -e quarkus.log.console.stderr=false -i guang1/jdbc-mcp:latest, then supply credentials
