MCPDBWizard

Documentation  ·  PostgreSQL

MCPDBWizard for Postgres

MCPDBWizard for Postgres is the same product pointed at PostgreSQL. You select the tables, views, functions, procedures, sequences and SQL statements an agent may use, and it generates an MCP server for exactly those. An object you did not select has no tool, no method and no class, and every call binds its values rather than passing SQL text. The console, the proxy, accounts, tokens, the access grid, audit and Context Pinning all work as they do on Oracle.

It is a separate image, because a Postgres image carries no Oracle driver at all:

docker pull ghcr.io/srmadscience/mcpdbwizard-postgres:2.0.33
docker pull docker.io/srmadscience/mcpdbwizard-postgres:2.0.33

Both registries hold the same multi-arch image (linux/amd64, linux/arm64). One licence covers both products: an MCPDBWizard licence unlocks the Oracle image and the Postgres image alike. See Commercials.

To get it running, follow Quickstart: Postgres.

Supported versions

PostgreSQL 16, 17 and 18. Each release is tested against all three. 15 and older are not supported: describing a SQL statement’s result columns relies on pg_prepared_statements.result_types, which arrived in 16.

What becomes a tool

ObjectToolsNotes
Table, view, materialized view, foreign table, partitioned tableget_by_pk, insert, update, delete, plus a lookup per unique key, index and foreign keyNeeds a primary key, as on Oracle. A partition is reached through its parent, not on its own.
Expression index (upper(name), date_trunc(...))A lookup tool per indexArguments are named for the index’s columns and typed by the expression, and the query is written so the index serves it.
Function or procedureOne tool per routineOverloads get one tool each; the description names the signature (Call PostgreSQL function app.price(numeric)) so the agent can tell them apart.
Function returning refcursor or SETOFOne tool returning rowsA refcursor returns at most 10,000 rows by default, as on Oracle.
Sequencenextval
Your own SQL statementOne tool per statementThe statement is described with PREPARE when the server is generated, so a bad statement is caught then, not on its first call.

Tool names carry the schema — sales_orders_get_by_pk for sales.orders — because a Postgres database commonly holds several schemas with tables of the same name. A name longer than 64 characters keeps its first 23 and last 31 characters with a hash between them, so the operation stays at the end.

How the types cross

PostgresOver MCP
integer, bigint, numeric, real, double precisionnumber
text, varchar, char, uuid, xml, enumstring
booleanboolean
date, timestampstring, at full microsecond precision
timestamptzstring, with its offset
time, timetz, interval, money, inet, cidr, macaddr, bit, range and multirange typesstring, in Postgres’s own text form (1 year 2 mons 3 days, [1,5))
byteabase64 string
Composite typeJSON object, keyed by attribute name
Array, or a domain over oneJSON array, keeping a lower bound other than 1
json, jsonbJSON text — a string holding the document, not an object
PostGIS geometry, geographyEWKT string: SRID=4326;POINT(1 2)
pgvector vector, halfvecarray of numbers
pgvector sparsevec{length, indices, values}, indices counting from 0

A domain crosses as its base type. A timestamp parameter accepts ISO (2026-11-03T10:55:00) and the JDBC form (2026-11-03 10:55:00.123456).

Not mapped yet: the geometric types (point, polygon, …), the text-search types (tsvector, tsquery), pg_lsn, and extension types other than PostGIS’s and pgvector’s (citext, hstore, …). Each needs a decision about how it crosses JSON, so none is guessed at: a routine with such a parameter is left out when the server is generated, and the log says why.

What is different from Oracle

Not supported

See also Known issues on Postgres.