LABSCO SUMMARY
Writes are off until you turn them on.
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.
What it is
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.
What you get
- 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.sqlsetting - 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
Requirements
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.
Setup effort
One command plus credentials — 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
USE CASES
01
Letting an assistant answer questions from a real database
Point the container at the JDBC URL with writes disabled, and every answer comes from a live read.
02
Exploring a schema you inherited
Ask what tables and columns exist and query them, without writing SQL against a database you do not know yet.
03
Allowing changes deliberately, for one session
Enable write SQL only on the run where you need it, and turn it back off when that work is done.
BEFORE YOU INSTALL
What to know first
Requires
docker on PATH
Where it runs
Both documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
TERMINAL
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:latestMCP Clients
Claude Desktop
CLAUDE DESKTOP · JSON
{
"mcpServers": {
"jdbc": {
"command": "docker",
"args": [
"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"
]
}
}
}Claude Desktop — env file
CLAUDE DESKTOP — ENV FILE · JSON
{
"mcpServers": {
"jdbc": {
"command": "docker",
"args": [
"run",
"--rm",
"--env-file",
".env",
"-e",
"quarkus.mcp.server.stdio.enabled=true",
"-e",
"quarkus.log.console.enable=false",
"-e",
"quarkus.log.console.stderr=false",
"-i",
"guang1/jdbc-mcp:latest"
]
}
}
}Docker reads --env-file .env relative to the folder it is started from, and Claude Desktop does not start it in yours, so .env has to be the full path to the file. The file holds the enable.write.sql, jdbc.user, jdbc.password and jdbc.url lines shown in the project README.