{"name":"io.github.arzharch/pgops-mcp","slug":"arzharch-pgops-mcp","title":"pgops","description":"Safe, audited PostgreSQL operations for AI agents: queries, migrations, EXPLAIN, containers","url":"https://mcp.market/server/arzharch-pgops-mcp","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":15,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-01T16:31:52.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/arzharch/pgops-mcp","website":null,"version":"0.1.9","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"pgops-mcp","version":"0.1.9","runtimeHint":"uvx","transport":{"type":"stdio"},"environmentVariables":[{"description":"PostgreSQL connection string for the database to operate on.","isRequired":true,"isSecret":true,"name":"PGOPS_DSN"},{"description":"Optional separate DSN for the read-only pool. Use a role with no write grants to enforce read-only at the database rather than only in the server.","isSecret":true,"name":"PGOPS_READONLY_DSN"},{"description":"Set to 1 to withhold every mutating tool. Write tools are not registered at all, so an agent cannot call them.","default":"0","name":"PGOPS_READ_ONLY"},{"description":"Set to 1 to register container.restart and container.exec. Off by default: Docker socket access is root-equivalent on the host.","default":"0","name":"PGOPS_APPROVAL_MODE"},{"description":"Path to the append-only JSONL audit log.","default":"~/.pgops/audit.jsonl","name":"PGOPS_AUDIT_LOG"},{"description":"Statement timeout applied to every query unless a tool call overrides it.","default":"5000","name":"PGOPS_DEFAULT_TIMEOUT_MS"},{"description":"Ceiling a caller-supplied timeout is clamped to.","default":"30000","name":"PGOPS_MAX_TIMEOUT_MS"},{"description":"Rows returned by query.read when the caller does not specify a limit.","default":"100","name":"PGOPS_DEFAULT_ROW_LIMIT"}]},{"registryType":"oci","identifier":"ghcr.io/arzharch/pgops-mcp:0.1.9","transport":{"type":"stdio"},"environmentVariables":[{"description":"PostgreSQL connection string. From inside a container, localhost is the container itself — use host.docker.internal or the compose service name.","isRequired":true,"isSecret":true,"name":"PGOPS_DSN"},{"description":"Set to 1 to withhold every mutating tool.","default":"0","name":"PGOPS_READ_ONLY"},{"description":"Path to the audit log inside the container. Mount a volume at this path or the log dies with the container.","default":"/var/lib/pgops/audit.jsonl","name":"PGOPS_AUDIT_LOG"}]}],"tools":[{"name":"container.exec","description":"Run a read-only diagnostic command inside a container. Requires --approval-mode AND a confirmation token, and the command must be in the diagnostic allowlist — this tool does not offer an arbitrary shell.","write_action":true,"price_micros":0,"input_schema":null},{"name":"container.logs","description":"Tail a container's logs, optionally filtered to a minimum Postgres severity (DEBUG/INFO/NOTICE/LOG/WARNING/ERROR/FATAL/PANIC).","write_action":false,"price_micros":0,"input_schema":null},{"name":"container.restart","description":"Restart a container. Requires --approval-mode AND a confirmation token. Dropping connections is disruptive; relay the reason to the user first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"container.stats","description":"CPU, memory and IO snapshot for a container. Takes about a second: a CPU percentage requires two samples to compute a delta.","write_action":false,"price_micros":0,"input_schema":null},{"name":"db.health","description":"Health snapshot: connections, cache hit ratio, dead tuples, long-running queries, waiting locks — each finding with a severity and explanation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"env.correlate","description":"Join db.health findings with the database container's resource usage and return plain-language hints about whether container pressure explains the database's symptoms.","write_action":false,"price_micros":0,"input_schema":null},{"name":"env.topology","description":"Discover containers, compose projects, ports and health, and identify which container serves this server's DSN (matched by published host port).","write_action":false,"price_micros":0,"input_schema":null},{"name":"index.advise","description":"Index recommendations: unused indexes, redundant indexes, sequential-scan hotspots, and the slowest statements by total time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.apply","description":"Apply a plan produced by migration.plan.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.describe","description":"Plan a schema change described in plain English.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.history","description":"Applied-migration history from the ledger, including any interrupted (in_flight) migration. Each entry carries the `ledger_id` that migration.rollback and migration.resolve take.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.plan","description":"Plan a migration from a target schema. Executes nothing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.resolve","description":"Close out an interrupted (in_flight) migration, unblocking further ones.","write_action":false,"price_micros":0,"input_schema":null},{"name":"migration.rollback","description":"Reverse an applied migration by its ledger id (from migration.history).","write_action":false,"price_micros":0,"input_schema":null},{"name":"query.explain","description":"Explain a statement and return the plan plus actionable verdicts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"query.read","description":"Execute a read-only statement (SELECT/WITH/EXPLAIN only).","write_action":true,"price_micros":0,"input_schema":null},{"name":"query.write","description":"Execute a mutating statement (INSERT/UPDATE/DELETE/DDL).","write_action":true,"price_micros":0,"input_schema":null},{"name":"schema.inspect","description":"Inspect database structure: tables, columns, indexes, constraints, sizes.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-20T20:11:12.329Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T20:11:12.312Z","components":{"code":{"score":25,"max":25,"notes":["36 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 19 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"pgops-mcp","version":"0.1.9","found":true,"license":"MIT","dependencyCount":14,"publishedAt":"2026-09-01T16:35:32.576558Z","repositoryUrl":"https://github.com/arzharch/pgops-mcp"}],"repo":{"found":true,"owner":"arzharch","repo":"pgops-mcp","archived":false,"pushedAt":"2026-09-01T16:31:52Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/143212088?v=4","ownerCreatedAt":"2023-08-25T17:06:33Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/143212088?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-01T16:31:52.000Z","score":15}}}},"grade_history":[],"reviews":[]}