by prest
PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new, MCP server
# Add to your Claude Code skills
git clone https://github.com/prest/prestGuides for using mcp servers skills like prest.
Last scanned: 7/10/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-07-10T07:33:56.421Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}prest is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by prest. PostgreSQL ➕ REST, low-code, simplify and accelerate development, ⚡ instant, realtime, high-performance on any Postgres application, existing or new, MCP server. It has 4,557 GitHub stars.
Yes. prest passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/prest/prest" and add it to your Claude Code skills directory (see the Installation section above).
prest is primarily written in Go. It is open-source under prest on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh prest against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
pREST (PostgreSQL REST), is a simple production-ready API, that delivers an instant, realtime, and high-performance application on top of your existing or new Postgres database.
PostgreSQL version 9.5 or higher
Contributor License Agreement -
The pREST project is the API that addresses the need for fast and efficient solution in building RESTful APIs on PostgreSQL databases. It simplifies API development by offering:
Overall, pREST simplifies the process of creating secure and performant RESTful APIs on top of your new or old PostgreSQL database.
When we built pREST, we originally intended to contribute and build with the PostgREST project, although it took a lot of work as the project is in Haskell. At the time, we did not have anything similar or intended to keep working with that tech stack. We've been building production-ready Go applications for a long time, so building a similar project with Golang as its core was natural.
Additionally, as Go has taken a huge role in many other vital projects such as Kubernetes and Docker, and we've been able to use the pREST project in many different companies with success over the years, it has shown to be an excellent decision.
Deploy to Heroku and instantly get a realtime RESTFul API backed by Heroku Postgres:
Visit https://docs.prestd.com/
pREST can expose a read-only MCP-style HTTP endpoint at /_mcp on the same server that already serves catalog, CRUD, and script routes.
This route is intended to reuse the existing pREST request pipeline rather than introduce a separate process or transport. That means the MCP surface inherits the same deployment model, auth, ACL, and database routing behavior already used by the rest of the API.
GET /_mcp returns a discovery payload with server metadata and available tools.POST /_mcp accepts JSON-RPC style requests for MCP operations.Currently supported methods:
initializetools/listtools/callThe first implementation is intentionally read-only. It exposes generic discovery tools and schema-aware table tools:
prest.list_databasesprest.list_schemasprest.list_tablesprest.describe_tableprest.select_tableprest.select.{database}.{schema}.{table}The schema-aware prest.select.{database}.{schema}.{table} tools are generated from the catalog and give MCP clients a stable, explicit read path for known tables.
Generated table tools now include typed input schemas derived from table metadata. MCP clients can inspect these schemas to discover:
columnsorder_by fields (field and -field for descending)filterslimit and offsetIn multi-database mode, tool generation expands across registered aliases.
Example initialize request:
POST /_mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize"
}
Example tool call:
POST /_mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "prest.describe_table",
"arguments": {
"database": "prest-test",
"schema": "public",
"table": "test"
}
}
}
Example schema-aware table tool call with projection, filter, and ordering:
POST /_mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "prest.select.prest-test.public.test",
"arguments": {
"columns": ["id", "name"],
"filters": {
"name": "prest tester"
},
"order_by": ["id"],
"limit": 5,
"offset": 0
}
}
}
400 Bad Request./_mcp requires authentication like other protected routes.The MCP route is covered by unit and integration tests, including live HTTP checks under integration/controllers/mcp_test.go and route coverage in integration/router/routes_test.go.
pREST uses the first URL path segment as the database selector for CRUD, catalog, and optional script routes. Two modes are supported:
| Mode | When | {database} in URL |
Connection target |
|---|---|---|---|
| Legacy multi-DB | No registry configured | Postgres database name | Same pg.host; dbname = path segment |
| Registry multi-cluster | [[databases]] or env registry set |
Registered alias | Per-profile host, port, and credentials |
All table operations use /{database}/{schema}/{table}:
GET /tenant-a/public/users
POST /tenant-a/public/orders
GET /tenant-a/public
GET /_QUERIES/tenant-a/myqueries/get_all
Script routes accept an optional database prefix (/_QUERIES/{database}/{queriesLocation}/{script}). When omitted, the default database (pg.database) is used.
Request flow: validate alias → set connection context → open or reuse pool for that alias → execute query.
Registry sources are merged in priority order: indexed env pairs → TOML (env wins on conflict).
Register databases with contiguous 1-based index pairs:
DATABASE_ALIAS_1=tenant-a
DATABASE_URL_1=postgres://user:pass@cluster-a.example.com:5432/app_a?sslmode=require
DATABASE_ALIAS_2=tenant-b
DATABASE_URL_2=postgres://user:pass@cluster-b.example.com:5432/app_b?sslmode=require
PREST_DATABASE_ALIAS_N and PREST_DATABASE_URL_N are accepted as aliases of the above keys.
See install-manifests/kubernetes/deployment.yaml for a multi-secret example with liveness/readiness probes.
pg.* remains the default/fallback profile; registry entries override host, port, and credentials per alias:
[pg]
database = "prest-test"
single = false
[[databases]]
alias = "prest-test"
host = "postgres"
port = 5432
database = "prest-test"
user = "postgres"
pass = "postgres"
ssl.mode = "disable"
[[databases]]
alias = "secondary-db"
host = "postgres-b"
port = 5432
database = "secondary-cluster"
user = "postgres"
pass = "postgres"
ssl.mode = "disable"
When no registry is configured, legacy DATABASE_URL / pg.* behavior is unchanged.
tenant-a).database, host, and credentials (e.g. app_a on cluster-a.example.com).pg.singleSet pg.single = false to allow routing to multiple databases or aliases. When true and a registry is active, only the default database alias is accepted.
Pools are keyed by connection URI; aliases that share the same URI share a pool. Connections are opened lazily on first request per alias.
Connection budgeting: plan for replicas × aliases × pg.maxopenconn connections per cluster. Use PgBouncer or RDS Proxy when many aliases are registered.
| Endpoint | Purpose | Behavior |
|---|---|---|
GET /_health |
Liveness | Pings the default database |
GET /_ready |
Readiness | Pings the default database and every registered alias |
access.tables entries support an optional database field for per-alias permissions:
[[access.tables]]
database = "tenant-a"
schema = "public"
name = "users"
permissions = ["read"]
Multi-cluster integration tests live in integration/controllers/multicluster_test.go. They require