oracle_query is the SELECT path and oracle_execute is where INSERT, UPDATE, DELETE and CREATE live, which means a client can be handed the read path without the write path; oracle_transaction sits above them with rollbackOnError for changes that must land together or not at all. Everything is driven by SQL the caller supplies — oracle_list_tables and oracle_describe_table exist so that SQL can be written against the real schema. The configuration is the tell for what this targets: a client library directory and an old-cryptography switch are settings you need for an existing installation, not a new one.
An Oracle Database server exposing 7 tools: a SELECT path, a write path, a transaction path, table listing and description, a connection health check and a configuration readout.
- Reads with the output shaped at call time: oracle_query runs a SELECT with maxRows capping the result, formatAsTable rendering it and showMetadata adding column information.
- Writes kept on a separate tool: oracle_execute runs INSERT, UPDATE, DELETE, CREATE and comparable statements, with autoCommit deciding whether the change lands immediately and showDetails reporting what it touched.
- Grouped changes: oracle_transaction takes a list of commands and runs them as a single transaction, with rollbackOnError deciding whether a failure undoes the whole set.
- Schema discovery before writing SQL: oracle_list_tables lists tables for an owner, and oracle_describe_table returns a table's structure and columns.
- The state of the connection itself: oracle_health_check reports whether the database connection is healthy, and oracle_info returns the database's configuration.
A reachable Oracle instance and an account on it — ORACLE_HOST, ORACLE_PORT, ORACLE_SERVICE_NAME, ORACLE_USERNAME and ORACLE_PASSWORD — plus ORACLE_CLIENT_LIB_DIR for the Oracle client library location and ORACLE_OLD_CRYPTO for a server that needs the older cryptography.
One command plus a key — npx @grec0/mcp-oracle-db, then supply credentials
