{"servers":[{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.Eszetael/postgres-mcp-hardened","description":"Read-only PostgreSQL over MCP. Writes refused at the parsed SQL, plus a READ ONLY transaction.","title":"PostgreSQL (hardened, read-only)","repository":{"url":"https://github.com/Eszetael/postgres-mcp-hardened","source":"github"},"version":"0.1.5","websiteUrl":"https://github.com/Eszetael/postgres-mcp-hardened","packages":[{"registryType":"npm","identifier":"postgres-mcp-hardened","version":"0.1.5","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"--stdio","type":"positional"}],"environmentVariables":[{"description":"Connection string for the role the server connects as. Use a role that cannot write — the server refuses writes twice, but a read-only role is the layer that does not depend on us being correct. `--print-setup-sql` prints the SQL that creates one.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Server-side statement timeout, e.g. `5s`. A question that would pin the database is cancelled by PostgreSQL, not by hope.","name":"MCP_STATEMENT_TIMEOUT"},{"description":"Comma-separated allowlist. A table off the list is refused by name, and hiding it inside a CTE, a view or a join does not help.","name":"MCP_ALLOW_TABLES"},{"description":"Path to the tamper-evident audit log. Entries are chained by hash and survive a restart; `--verify-audit` checks the chain against an off-host anchor.","name":"MCP_AUDIT_LOG"}]},{"registryType":"oci","identifier":"ghcr.io/eszetael/postgres-mcp-hardened:0.1.5","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Connection string for a role that cannot write.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Address to bind, default 127.0.0.1:8080.","name":"MCP_ADDR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-08-09T23:19:15.018068Z","publishedAt":"2026-08-09T23:19:15.018068Z","updatedAt":"2026-08-09T23:19:15.018068Z","isLatest":false}}},{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.Eszetael/postgres-mcp-hardened","description":"Read-only PostgreSQL over MCP. Writes refused at the parsed SQL, plus a READ ONLY transaction.","title":"PostgreSQL (hardened, read-only)","repository":{"url":"https://github.com/Eszetael/postgres-mcp-hardened","source":"github"},"version":"0.1.6","websiteUrl":"https://github.com/Eszetael/postgres-mcp-hardened","packages":[{"registryType":"npm","identifier":"postgres-mcp-hardened","version":"0.1.6","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"--stdio","type":"positional"}],"environmentVariables":[{"description":"Connection string for the role the server connects as. Use a role that cannot write — the server refuses writes twice, but a read-only role is the layer that does not depend on us being correct. `--print-setup-sql` prints the SQL that creates one.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Server-side statement timeout, e.g. `5s`. A question that would pin the database is cancelled by PostgreSQL, not by hope.","name":"MCP_STATEMENT_TIMEOUT"},{"description":"Comma-separated allowlist. A table off the list is refused by name, and hiding it inside a CTE, a view or a join does not help.","name":"MCP_ALLOW_TABLES"},{"description":"Path to the tamper-evident audit log. Entries are chained by hash and survive a restart; `--verify-audit` checks the chain against an off-host anchor.","name":"MCP_AUDIT_LOG"}]},{"registryType":"oci","identifier":"ghcr.io/eszetael/postgres-mcp-hardened:0.1.6","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Connection string for a role that cannot write.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Address to bind, default 127.0.0.1:8080.","name":"MCP_ADDR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-08-15T14:07:24.041727Z","publishedAt":"2026-08-15T14:07:24.041727Z","updatedAt":"2026-08-15T14:07:24.041727Z","isLatest":false}}},{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.Eszetael/postgres-mcp-hardened","description":"Read-only PostgreSQL over MCP. Writes refused at the parsed SQL, plus a READ ONLY transaction.","title":"PostgreSQL (hardened, read-only)","repository":{"url":"https://github.com/Eszetael/postgres-mcp-hardened","source":"github"},"version":"0.1.7","websiteUrl":"https://github.com/Eszetael/postgres-mcp-hardened","packages":[{"registryType":"npm","identifier":"postgres-mcp-hardened","version":"0.1.7","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"--stdio","type":"positional"}],"environmentVariables":[{"description":"Connection string for the role the server connects as. Use a role that cannot write — the server refuses writes twice, but a read-only role is the layer that does not depend on us being correct. `--print-setup-sql` prints the SQL that creates one.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Server-side statement timeout, e.g. `5s`. A question that would pin the database is cancelled by PostgreSQL, not by hope.","name":"MCP_STATEMENT_TIMEOUT"},{"description":"Comma-separated allowlist. A table off the list is refused by name, and hiding it inside a CTE, a view or a join does not help.","name":"MCP_ALLOW_TABLES"},{"description":"Path to the tamper-evident audit log. Entries are chained by hash and survive a restart; `--verify-audit` checks the chain against an off-host anchor.","name":"MCP_AUDIT_LOG"}]},{"registryType":"oci","identifier":"ghcr.io/eszetael/postgres-mcp-hardened:0.1.7","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Connection string for a role that cannot write.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Address to bind, default 127.0.0.1:8080.","name":"MCP_ADDR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-08-18T07:14:04.665947Z","publishedAt":"2026-08-18T07:14:04.665947Z","updatedAt":"2026-08-18T07:14:04.665947Z","isLatest":false}}},{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.Eszetael/postgres-mcp-hardened","description":"Read-only PostgreSQL over MCP. Writes refused at the parsed SQL, plus a READ ONLY transaction.","title":"PostgreSQL (hardened, read-only)","repository":{"url":"https://github.com/Eszetael/postgres-mcp-hardened","source":"github"},"version":"0.1.8","websiteUrl":"https://github.com/Eszetael/postgres-mcp-hardened","packages":[{"registryType":"npm","identifier":"postgres-mcp-hardened","version":"0.1.8","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"--stdio","type":"positional"}],"environmentVariables":[{"description":"Connection string for the role the server connects as. Use a role that cannot write — the server refuses writes twice, but a read-only role is the layer that does not depend on us being correct. `--print-setup-sql` prints the SQL that creates one.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Server-side statement timeout, e.g. `5s`. A question that would pin the database is cancelled by PostgreSQL, not by hope.","name":"MCP_STATEMENT_TIMEOUT"},{"description":"Comma-separated allowlist. A table off the list is refused by name, and hiding it inside a CTE, a view or a join does not help.","name":"MCP_ALLOW_TABLES"},{"description":"Path to the tamper-evident audit log. Entries are chained by hash and survive a restart; `--verify-audit` checks the chain against an off-host anchor.","name":"MCP_AUDIT_LOG"}]},{"registryType":"oci","identifier":"ghcr.io/eszetael/postgres-mcp-hardened:0.1.8","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Connection string for a role that cannot write.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Address to bind, default 127.0.0.1:8080.","name":"MCP_ADDR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-08-18T13:09:28.262933Z","publishedAt":"2026-08-18T13:09:28.262933Z","updatedAt":"2026-08-18T13:09:28.262933Z","isLatest":false}}},{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.Eszetael/postgres-mcp-hardened","description":"Read-only PostgreSQL over MCP. Writes refused at the parsed SQL, plus a READ ONLY transaction.","title":"PostgreSQL (hardened, read-only)","repository":{"url":"https://github.com/Eszetael/postgres-mcp-hardened","source":"github"},"version":"0.1.9","websiteUrl":"https://github.com/Eszetael/postgres-mcp-hardened","packages":[{"registryType":"npm","identifier":"postgres-mcp-hardened","version":"0.1.9","runtimeHint":"npx","transport":{"type":"stdio"},"runtimeArguments":[{"isRequired":true,"value":"--stdio","type":"positional"}],"environmentVariables":[{"description":"Connection string for the role the server connects as. Use a role that cannot write — the server refuses writes twice, but a read-only role is the layer that does not depend on us being correct. `--print-setup-sql` prints the SQL that creates one.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Server-side statement timeout, e.g. `5s`. A question that would pin the database is cancelled by PostgreSQL, not by hope.","name":"MCP_STATEMENT_TIMEOUT"},{"description":"Comma-separated allowlist. A table off the list is refused by name, and hiding it inside a CTE, a view or a join does not help.","name":"MCP_ALLOW_TABLES"},{"description":"Path to the tamper-evident audit log. Entries are chained by hash and survive a restart; `--verify-audit` checks the chain against an off-host anchor.","name":"MCP_AUDIT_LOG"}]},{"registryType":"oci","identifier":"ghcr.io/eszetael/postgres-mcp-hardened:0.1.9","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Connection string for a role that cannot write.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"Address to bind, default 127.0.0.1:8080.","name":"MCP_ADDR"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-08-18T14:23:23.689513Z","publishedAt":"2026-08-18T14:23:23.689513Z","updatedAt":"2026-08-18T14:23:23.689513Z","isLatest":true}}}],"metadata":{"count":5}}
