{"name":"ai.midplane/midplane","slug":"midplane","title":"Midplane","description":"Safe-by-default SQL guardrails for AI agents: AST-checked queries, per-table policy, audit log.","url":"https://mcp.market/server/midplane","rating":null,"grade":"B","score":80,"certified":false,"status":"active","category":"data","tags":["data"],"presence":{"score":34,"stars":5,"forks":1,"downloads_week":55,"last_push_at":"2026-08-28T13:06:59.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/midplaneai/midplane","website":"https://midplane.ai/docs","version":"0.20.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"midplane","version":"0.20.0","runtimeHint":"npx","transport":{"type":"stdio"},"packageArguments":[{"value":"server","type":"positional","valueHint":"subcommand"},{"type":"named","name":"--stdio"}],"environmentVariables":[{"description":"Postgres connection string the agent's queries run against. Give it a least-privilege role: Midplane constrains what SQL is allowed, it does not widen or narrow what the role itself can reach.","isRequired":true,"format":"string","isSecret":true,"name":"DATABASE_URL"},{"description":"Path to a policy YAML granting per-table read/read_write access, tenant scoping, and column masking. Omit for the safe default: reads allowed, writes and DDL denied. Generate one with `npx midplane init`.","format":"filepath","name":"MIDPLANE_POLICY_FILE"},{"description":"Where the local SQLite audit log is written. Defaults to ~/.midplane/audit.db; read it back with `midplane audit denies`.","format":"filepath","name":"DB_PATH"},{"description":"Set to 0 to disable anonymous usage telemetry (DO_NOT_TRACK=1 also works). Never includes SQL, table or column names, or identifiers.","default":"1","choices":["1","0","debug"],"name":"MIDPLANE_TELEMETRY"}]},{"registryType":"oci","identifier":"docker.io/midplane/midplane:0.20.0","runtimeHint":"docker","transport":{"type":"streamable-http","url":"http://localhost:8080/mcp"},"environmentVariables":[{"description":"Postgres connection string the agent's queries run against. Pass it with --env-file, never with an inline -e: a DSN on the docker command line leaks the password to `ps aux` and your shell history.","isRequired":true,"format":"string","isSecret":true,"name":"DATABASE_URL"},{"description":"Path (inside the container) to a policy YAML granting per-table read/read_write access, tenant scoping, and column masking. Omit for the safe default: reads allowed, writes and DDL denied.","format":"filepath","name":"MIDPLANE_POLICY_FILE"},{"description":"Port the Streamable HTTP transport binds. Must match the url above if changed.","default":"8080","name":"PORT"}]}],"tools":[{"name":"check_approval","description":"Poll a held write's approval status WITHOUT running anything. Use this to wait — it is cheap, safe to call repeatedly, and never consumes the approval. Returns pending (with its deadline), approved (call query again with the same sql and intent to actually execute it), executed (already ran — do not repeat), denied (with the reviewer's note), or expired. Never returns the statement or its results.","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_table","description":"Returns column name, data type, nullability, and default. Routed through the policy + audit pipeline.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_databases","description":"Returns each database's name, whether tenant_scope is enforced, and its table_access default. Use this to discover which `database` values to pass to `query`, `describe_table`, and `list_tables`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tables","description":"Routed through the same policy + audit pipeline. Defaults to the 'public' schema.","write_action":false,"price_micros":0,"input_schema":null},{"name":"query","description":"Parses the SQL with libpg_query, applies Midplane policy (table_access, multi_statement, tenant_scope, parse_error), audits the call, and returns rows on ALLOW. Denials return policy_rule + reason; the call is still audited. Required `intent` field captures why the query is being run (visible in audit logs).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":80,"grade":"B","scanned_at":"2026-09-21T13:03:50.198Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-21T13:03:50.246Z","components":{"code":{"score":25,"max":25,"notes":["3 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 24 days ago"]},"identity":{"score":6,"max":10,"notes":["namespace and repository owner differ","website matches verified namespace"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"midplane","version":"0.20.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":8,"publishedAt":"2026-08-25T13:07:15.216Z","repositoryUrl":"git+https://github.com/midplaneai/midplane.git","weeklyDownloads":55}],"repo":{"found":true,"owner":"midplaneai","repo":"midplane","archived":false,"pushedAt":"2026-08-28T13:06:59Z","stars":5,"forks":1,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/280304100?v=4","ownerCreatedAt":"2026-04-29T08:34:07Z","license":"MIT"},"icon":{"url":"https://www.midplane.ai/brand/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":5,"forks":1,"downloadsWeek":55,"license":"MIT","lastPushAt":"2026-08-28T13:06:59.000Z","score":34}}}},"grade_history":[],"reviews":[]}