PostgreSQL + Redis + ClickHouse + SQLite in one extension. Free. Open source. No paywalls.
Why Viewstor?
Database extensions for VS Code are either locked to one database, or freemium with crippled free tiers (limited connections, no export, closed source). Switching between DBeaver and VS Code breaks flow. DataGrip costs money.
Viewstor is a free, open-source extension that covers PostgreSQL, Redis, ClickHouse, and SQLite in a single tool — with features you won't find elsewhere:
Passwords are excluded for security — you'll enter them on first connect. See the Wiki for detailed migration guides.
Features
Safe Mode
Production databases deserve guardrails. Safe mode runs EXPLAIN before every SELECT and catches full table scans:
Mode
Behavior
Block
Blocks queries with full scans. Shows EXPLAIN plan
Warn
Warning with "Run Anyway" / "See EXPLAIN" / "Cancel"
Off
No checks
Supports PostgreSQL (Seq Scan), SQLite (SCAN TABLE via EXPLAIN QUERY PLAN), and ClickHouse. Set globally in settings or per connection. Auto-adds LIMIT to SELECTs that don't have one.
Read-only Mode
Mark a connection or an entire folder as read-only. Child connections inherit the setting. Mutations are blocked in the query editor, result grid, and MCP commands.
Connections
Nested folders with drag-and-drop for connections and folders
Multi-database — list several databases in one connection, each as a separate tree node
Color coding — theme-aware palette or hex picker, tints icons; folders pass color to children
SSL and SSH tunnel / SOCKS5 proxy support
Native VS Code form chrome — Connection / Folder forms built on @vscode-elements/elements with @vscode/codicons; render correctly in light, dark, and high-contrast themes. Power-user settings (Safe mode override, Store in, Hidden schemas) tucked under a collapsible Advanced section so the default form stays short
Auto-collapse single-database and single-schema levels
Hide schemas/databases from context menu
Inaccessible objects (no permissions) rendered in error color
Query Editor
Per-connection SQL tabs (Ctrl+Enter to execute)
SQL autocomplete — context-aware: tables after FROM/JOIN, columns from referenced tables, table.column dot trigger, alias resolution, enum value suggestions after =/IN
SQL diagnostics — error underline for non-existent tables, warning for unknown columns
Index hints — warning diagnostics on WHERE/ORDER BY columns without an index
Estimated row count from statistics, exact count via refresh
Editable SQL bar above the table — edit the query in place, pagination stays live (host re-applies LIMIT N OFFSET p*N and fetches an exact COUNT(*) for the user's query); your explicit LIMIT acts as a ceiling across pages; only read-only SQL (SELECT / WITH / EXPLAIN / SHOW / VALUES) runs from the bar
Inline editing with PK-based UPDATE, type-aware SQL (numeric PKs without quotes, ::jsonb cast)
Add / delete rows — insert with DEFAULT values, delete from toolbar or right-click context menu
Resizable columns — drag column header edge to adjust width
Refresh button — re-run current query without page reload
Column sorting (shift-click for multi-column); manual ORDER BY in the SQL bar syncs back to the header indicators
Cell selection with drag, Shift+Click range, resize handle
Search with Ctrl+F, Enter to cycle matches
Export & Copy
Export all rows (not just current page) — CSV, TSV, JSON, Markdown
Click the chart button in the Result Panel toolbar to open the chart panel
Config sidebar — axis mapping, aggregation, group by, area fill, legend
Auto-detection — suggests the best chart type based on column types (time → line, categorical → pie, etc.)
Multi-source charts — overlay data from multiple queries on one chart:
Execute and pin queries you want to combine (pin icon in Query History)
Open a chart from any result set
Click + Data Source in the chart toolbar, pick a pinned query
Choose merge mode:
Separate series — each source rendered as independent series (different X values are fine)
Join by column — rows matched by a key column (like SQL LEFT JOIN), additional Y columns merged into the primary dataset
Select which numeric columns to include, set a label — done
Example: pin SELECT ts, cpu FROM metrics and SELECT ts, mem FROM metrics, open chart from CPU, add Memory as data source with join on ts — both metrics on the same time axis.
Data Diff
Compare data between tables — even across different connections (dev vs staging):
Right-click a table → Compare With... → pick another table from any connected database
Schema diff — compare column names, types, nullability, PK status, plus indexes, constraints, triggers, and sequences
Statistics diff — side-by-side row count, table/index/total size, dead tuples, last vacuum/analyze, scan counters (PostgreSQL); row count, compressed/uncompressed size, compression ratio, parts, engine (ClickHouse); row count, table size, index/trigger counts (SQLite). Only shown when both sides are the same database type
Custom SQL — editable queries per side under the collapsible "SQL" block, with Synced toggle + lock indicator for mirrored edits
Tab headers show colored count badges (e.g. Schema Diff •6); filter chips per tab (click to solo, Shift+click to toggle)
Export diff as CSV or JSON
Configure max rows in settings (viewstor.diffRowLimit, default 10,000)
Also available via Command Palette: Viewstor: Compare Data.
Click the 🗺 map button in the Result Panel toolbar to open the map for the current result set
Auto-detects coordinate columns:
GeoJSON Point ({"type":"Point","coordinates":[lng,lat]})
WKT (POINT(lng lat))
{lat, lng} / {latitude, longitude} objects
[lng, lat] arrays or PG array strings ({lng,lat})
Separate lat / lng columns
Manual column picker — toolbar has a Mode toggle (Single column / Lat + Lng) and selects for picking the coordinate and label columns by hand when auto-detection doesn't match; hover a field label for a tooltip with format hints
Circle markers tinted with the VS Code accent color, with a popup (click) that shows the full row
Labels — when the result contains ≤50 points the chosen label column is rendered permanently on each marker; otherwise it shows on hover
Auto-zoom to fit all points; up to 10,000 points rendered per view
Copilot Chat (@viewstor)
Ask questions about your database in natural language:
@viewstor describe the users table
@viewstor write a query to find orders without payments
@viewstor what indexes are missing for this query?
@viewstor /chart show request latency over the last hour grouped by endpoint
Schema context is injected automatically from the active connection. Slash commands: /schema, /query, /describe, /chart. Requires GitHub Copilot.
AI Agent Integration (MCP)
Two MCP interfaces — pick the one that fits your workflow:
VS Code MCP commands (for Copilot, Cursor — agents running inside VS Code):
Command
What it does
viewstor.mcp.listConnections
List connections with status
viewstor.mcp.getSchema
Flattened schema (tables, columns, types)
viewstor.mcp.executeQuery
Run SQL (read-only enforced)
viewstor.mcp.getTableData
Fetch rows with limit
viewstor.mcp.getTableInfo
Column metadata, PKs, nullability
viewstor.mcp.visualize
Execute query and open chart panel
viewstor.mcp.openQuery
Open SQL editor with query text (optionally execute)
viewstor.mcp.openTableData
Open table data view with optional custom query
Standalone MCP server (for Claude Code, Cline — CLI agents running outside VS Code):
The extension installs a launcher at ~/.viewstor/mcp-server.js that auto-updates on each activation — no manual path changes needed when the extension updates.
Quick setup:Ctrl+Shift+P → Viewstor: Setup MCP → Copy Config → paste into your agent's MCP config.
9 tools: list_connections, get_schema, execute_query, get_table_data, get_table_info, add_connection, reload_connections, build_chart. Reads connections from ~/.viewstor/connections.json and .vscode/viewstor.json. Connections sync bidirectionally with the VS Code extension. See the MCP Server wiki page for setup instructions.
All MCP interfaces auto-connect and respect read-only mode.
Data-oriented tools (execute_query, get_schema, get_table_data, get_table_info, build_chart) accept an optional database parameter — query another database on the same server without creating a new connection or re-entering the password.
Other
Query history with execution time and row count — click to re-execute
DDL viewer for tables, views, indexes, triggers, sequences
JSON/JSONB cell editor with syntax highlighting (double-click to open)
npm run dev # development build
npm run watch # rebuild on changes
npm run build # production build
npm run lint # ESLint check
npm run lint:fix # auto-fix
npm test # unit tests (vitest)
npm run test:e2e # e2e tests (Docker required)
npm run package # .vsix package