GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • ZenStack Studio
  • MCP server
  • Start Studio
  • Docs
  • GitHub
  • Sign in

This view

  • Original page
  • New address

GeezerVison is showing studio.zenstack.dev — ZenStack Studio — Database GUI and MCP Server for AI Agents

A database studio for you and your AI agent.

Browse Postgres, MySQL, or SQLite in a visual editor, and let Claude Code or Cursor query it over MCP, without handing your agent a connection string to every customer's data.

$npx @zenstackhq/cli studio --introspect
Start StudioRead the docs →

t + 0s

~/acme-api — zsh
$npx @zenstackhq/cli studio --introspect
Introspecting postgresql://localhost:5432/acme …
✔ 14 models written to zenstack/schema.zmodel
✔ Proxy listening on http://localhost:2311
→ Studio ready at studio.zenstack.dev
$

t + 9s

ZenStack Studio — acme / public.Order
customerIdtextcustomer.nametexttotaldecimalitemsOrderItem[]
cus_4f10a2Dana Whitfield$1,240.003 records
cus_91bd77Marcus Ilori$318.501 record
cus_2ac085Priya Raman$2,905.0011 records
Order.items — 3 records
Studio Monitor$890.00
USB-C Hub$210.00
Braided Cable$140.00

Features

Point it at your database. It just works.

Your database stays on your network

Studio and your agent talk to a small proxy you start with one command, not to your database.

  • ✓No connection string to share. Only the proxy you run holds the credentials.
  • ✓Works on localhost or inside your intranet, with nothing exposed to the internet.
Studio & agent
no credentials
↓→
Your network · localhost or intranet
Proxy
holds DATABASE_URL
↓→
Database
not public

A table editor that follows your relations

Pull in fields from related tables and filter across relations without writing a join.

Studio — public.Order
items.some.category = "audio"customer.name ~~ "Sam"
idtextcustomer.nametextitems.countOrderItem[]
ord_8f21Sam Smith3 records
ord_8f37Sam Okafor11 records

Query without writing SQL

Autocomplete on every model, field, and relation, checked against your schema.

Studio — query editor
await db.order.findMany({
where: { status: 'shipped' },
include: { customer: true, items: { include: { pro|
} } }
})
productProduct
productIdString
promotionPromotion?

Your database as an MCP server

You have full control over what the agent can see and do, table by table. Here it may read orders but not their line items, and it says so instead of working around the rule. See how it works.

Claude Code — MCP: zenstack-studio

show me order-002 with its order items

Used 3 tools (1 failed)

orderstatustotalcustomer
order-002DELIVERED59.99Alice Johnson

Blocked

I couldn't include the order items, because OrderItem is not readable through this MCP.

Authorization

Not everyone should see everything.

Write the rules once as access policies next to your models. They work like Postgres row-level security, but better:

  • ✓Filter rows, hide fields, and block writes, per user.
  • ✓No database roles or session variables to manage.
  • ✓The same rules on Postgres, MySQL, and SQLite.
  • ✓Readable code in your schema, reviewed like the rest of it.

They hold in the studio and over MCP alike.

See your data as any user

Pick a user and every query runs as them. Hidden rows stay hidden.

View as[email protected] · supportanonymous · superuser · pick a user
View as superuser — public.Order
18,902 rows · 11 columns
idtextcustomer.nametexttotaldecimalcard_last4text
ord_8f21Dana Whitfield$1,240.004242
ord_8f22Marcus Ilori$318.501881
ord_8f23Priya Raman$2,905.009002
ord_8f24Tomás Rivera$74.993310
View as [email protected] — public.Order
3 rows · 10 columns · card_last4 hidden
idtextcustomer.nametexttotaldecimalcard_last4text
ord_8f21Dana Whitfield$1,240.00— hidden —
ord_9a04Dana Whitfield$62.00— hidden —
ord_9c77Dana Whitfield$430.10— hidden —

Scope your agent to the signed-in user

Your backend signs an identity for whoever is signed in, on every request. One assistant then answers each customer from their own data, and nobody else's.

your backend — api/assistant.ts
// on every request, for whoever is signed in
const identity = jwt.sign(
  { type: 'user', data: { userId: session.user.id } },
  MCP_SECRET
)
acme.com — Assistant

signed in as [email protected]

What did I spend last month?

$1,732.10 across 3 orders.

acme.com — Assistant

signed in as [email protected]

What did I spend last month?

$318.50 on 1 order.

Pricing

Free on your machine. Pro when you go public.

Free

$0

Everything on this page, except the two Pro features.

  • ✓Table and query editors
  • ✓MCP server for your agents
  • ✓Runs on localhost or your intranet

Pro

$40 /month per organization

Everything in Free, plus:

  • ✓AuthenticationDeploy the proxy on a public network and use Studio from anywhere.
  • ✓AuthorizationImpersonate any user, in the editors or through the MCP server.
Start Studio

FAQ

Frequently asked questions

Do I need to use the ZenStack ORM?

No. Studio introspects your existing database and leaves your application code alone. Access policies are optional.

Does Studio see my database credentials?

No. Studio talks to a proxy you run, often on localhost. Your credentials never leave your machine or your infrastructure.

Which databases are supported?

PostgreSQL, MySQL, and SQLite.

How does authorization work?

You declare access policies next to your models, like row-level security that lives in your schema. The table editor, the query editor, and the MCP server all enforce them.

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.