read_queryLABSCO SUMMARY
Register the same database twice — once read-only, once not.
The generated config does exactly this for Oracle, and it is the right pattern: the model reaches for the read-only entry for everything except the rare write, which has to be asked for by name. Two flags look alike in the output of database_info and are not the same thing: mcp_server_readonly_mode is this server's setting, read_only is the database's own. Check the first one when you want to know what the agent can do.
What it is
A Quarkus-based set of MCP servers packaged so each one is a single JAR or a single container. The JDBC server is the centre of it: point it at a connection string and any database with a JDBC driver becomes queryable.
What you get
read_queryruns SELECTs,list_tableslists what is there,describe_tablereturns a table's structure, anddatabase_inforeports on the database — including whether read-only mode is onwrite_queryfor INSERT, UPDATE and DELETE andcreate_tablefor schema changes, both blocked when read-only mode is active- Read-only mode as a launch flag —
--jdbc.readonly=true— rather than a permission you have to arrange in the database - Drivers for Oracle, PostgreSQL, MySQL, H2, SQLite, SQL Server and MariaDB, each with its connection-string shape documented
- Three more servers alongside it: a filesystem server that exposes a directory you name, a containers server, and a JVM insights server
Requirements
JDK 17 — the repository ships ./setup-jdk17.sh, which detects your architecture and OS, downloads a build, and writes an environment file you source. Then ./build-no-tests.sh produces the JARs. From there either run the JAR directly with java -jar, or build the Docker image with ./docker-mcp.sh build and run each server as a container. ./docker-mcp.sh config generates a ready-made Claude Desktop configuration for all four servers. Database credentials go on the launch command as --jdbc.url, --jdbc.user and --jdbc.password.
Setup effort
One command — docker run -i --rm --network host mcp-servers:latest jdbc --jdbc.url=jdbc:oracle:thin:@localhost:1521:xe --jdbc.user=ORACLEUSR --jdbc.password=ORACLEUSR --jdbc.readonly=false
USE CASES
Letting an assistant explore a production database safely
Launch with read-only mode on, so writes and table creation are refused rather than trusted not to happen.
Connecting to a database nobody wrote a server for
Any JDBC driver works — Oracle, SQL Server, MariaDB and SQLite all take the same launch shape.
Confirming what mode you are actually in
Read the server's own read-only flag before assuming a session is safe.
Giving an agent a working directory
Run the filesystem server against one mounted path instead of the whole machine.
6 tools
Listed in project docs. Your client may show a different list.
list_tablesdescribe_tabledatabase_infowrite_querycreate_tableBEFORE YOU INSTALL
What to know first
Tools you get
6 tools named in the project's documentation.
Requires
docker on PATH
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
Server setup
docker run -i --rm --network host mcp-servers:latest jdbc --jdbc.url=jdbc:oracle:thin:@localhost:1521:xe --jdbc.user=ORACLEUSR --jdbc.password=ORACLEUSR --jdbc.readonly=falseMCP Clients
Claude Desktop — Docker
{
"mcpServers": {
"jdbc-oracle-docker": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--network",
"host",
"mcp-servers:latest",
"jdbc",
"--jdbc.url=jdbc:oracle:thin:@localhost:1521:xe",
"--jdbc.user=ORACLEUSR",
"--jdbc.password=ORACLEUSR",
"--jdbc.readonly=false"
]
}
}
}