summarize_databaseLABSCO SUMMARY
The database vendor's own server, with the write path gated three separate times.
Read-only is enforced by the transaction — BEGIN READ ONLY, not a pattern match over the SQL — which is the version of that guarantee actually worth having. The write tool then sits behind three independent layers: it does not exist unless enabled, the guardrails can demand a WHERE clause and cap insert size, and the destructive annotation makes a compliant client ask before each call. That layering, plus being maintained by Yugabyte, is the argument for it over a generic Postgres server.
What it is
Yugabyte's own server for YugabyteDB and PostgreSQL. It summarises a schema, runs SELECTs inside a read-only transaction, and — only when explicitly enabled — executes write statements through a configurable guardrail layer.
What you get
- summarize_database lists a schema's tables with their columns and row counts, read-only
- run_read_only_query executes a SELECT under BEGIN READ ONLY and returns the result as JSON, so the constraint is enforced by the transaction rather than by inspecting the SQL string
- run_write_query covers INSERT, UPDATE, DELETE, MERGE, TRUNCATE and DDL behind a guardrail blocklist, and does not exist at all unless it has been enabled
- The write tool is annotated destructiveHint, so a client such as Claude Desktop asks for confirmation before every call even where the guardrails would have let the statement through
- Guardrails you set yourself: a cap on how many rows an INSERT … VALUES may carry, defaulting to 1000, and optional refusal of an UPDATE or DELETE that has no WHERE clause
- Stdio by default, or HTTP — with stateless Streamable HTTP for a self-hosted deployment running several replicas
- Optional OAuth through AWS Cognito or a generic OIDC provider, with Origin-header validation for a remote deployment
Requirements
Python 3.10 or newer, published on PyPI as yugabytedb-mcp-server and runnable through uvx, pipx, uv tool or pip — while v2 is still a release candidate, installing it needs an explicit version or a pre-release flag. YUGABYTEDB_URL takes a libpq connection string. Writes require YB_MCP_ENABLE_WRITE_QUERY, with the insert-row cap and the WHERE-clause requirements as separate settings. In HTTP mode it binds to 127.0.0.1 by default; exposing it on all interfaces makes MCP_AUTH_PROVIDER mandatory, alongside MCP_BASE_URL and an Origin allowlist.
Setup effort
One command plus credentials — pipx install yugabytedb-mcp-server==2.0.0rc2, then supply credentials
USE CASES
Getting oriented in a schema you did not design
One call lists the tables with their columns and row counts, which is enough to know where the data actually lives.
Answering a question with a query
Read the schema first, then run the SELECT inside a read-only transaction and get the rows back as JSON.
Letting an assistant explore a production database
With the write tool left disabled, the read-only transaction is the boundary rather than a promise about behaviour.
Making a change that has already been agreed
Enable the write tool deliberately, keep the WHERE-clause requirement on, and confirm the prompt the client raises before it runs.
3 tools
Listed in project docs. Your client may show a different list.
run_read_only_queryrun_write_queryBEFORE YOU INSTALL
What to know first
Tools you get
3 tools named in the project's documentation.
Requires
- uvx on PATH
- Python 3.10+
- YUGABYTEDB_URL in your environment
Where it runs
All 4 documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
pipx install yugabytedb-mcp-server==2.0.0rc2MCP Clients
Claude Desktop — uvx, Cursor — uvx, Windsurf — uvx
{
"mcpServers": {
"yugabytedb": {
"command": "uvx",
"args": [
"yugabytedb-mcp-server@2.0.0rc2"
],
"env": {
"YUGABYTEDB_URL": "host=<YOUR_HOST> port=5433 dbname=<YOUR_DBNAME> user=<YOUR_USER> password=<YOUR_PASSWORD>"
}
}
}
}Claude Desktop — installed CLI
{
"mcpServers": {
"yugabytedb": {
"command": "yugabytedb-mcp",
"env": {
"YUGABYTEDB_URL": "host=<YOUR_HOST> port=5433 dbname=<YOUR_DBNAME> user=<YOUR_USER> password=<YOUR_PASSWORD>"
}
}
}
}