tabellum-mcp
The stdio shim for Tabellum's MCP server.
The Tabellum desktop app hosts an MCP server on loopback while it runs; this
package forwards MCP clients that only speak stdio (Claude Code, Cursor, …) to
it. It has no tools of its own — the tool list, the approval gate, and the
privacy rules are the app's.
// Claude Code: .mcp.json
{
"mcpServers": {
"tabellum": {
"command": "npx",
"args": ["-y", "@dudko.dev/tabellum-mcp"]
}
}
}
The shim reads the app's discovery file, ~/.tabellum/mcp.json, for the port
and the per-install token. If the app is not running, every call answers
"Tabellum is not running" instead of starting anything.
Requires Node.js 24 or newer. Desktop only: the app hosts the server on macOS,
Windows, and Linux.
What an agent gets
The same tools as Tabellum's in-app agent, served by the app. Reads run at
once; anything that writes waits for the user's click in the app.
| Look around | |
list_connections | The connections: names, drivers, read-only flags. No hosts, no users. |
describe_schema | Every schema of a connection with its table, view, function, procedure, and sequence names. |
describe_object | Columns, indexes, constraints, and the CREATE of one object. |
list_users | Users and roles with their flags (login, superuser, member of), where the database lists them. |
sample_rows | Up to N rows of a table — only where the connection shares rows. |
| Query | |
run_read | Runs a statement only if the engine classifies it as a read; anything else answers needs_approval. |
explain | The estimated plan of a read, as a tree and one line per operator; nothing runs. |
propose_write | A write, DDL, or admin statement for the approval gate: the user sees the exact SQL and commits or declines in the app (10-minute timeout). |
open_editor_tab | Opens a query tab on a connection; returns its id. |
draft_to_editor | Types SQL into a tab while the user watches, without running it. |
| Compare schemas | |
compare_schemas | Diffs a connection against another or against a saved snapshot; with migration: true, the statements that close the gap. Nothing runs. |
save_schema_snapshot | Saves a connection's schema to the workspace as a snapshot. |
list_schema_snapshots | The snapshots in the workspace. |
| Dashboards | |
list_dashboards | The dashboards in the workspace. |
get_dashboard | One dashboard's file and its panels. |
propose_dashboard | A new or changed dashboard; the user sees the diff and applies it. |
| Schema designs | |
list_designs | The schema designs in the workspace. |
get_design | One design's file and its objects. |
propose_design | A new or changed design; the user sees what is added, changed, and removed, and puts it on the canvas. Nothing runs against a database. |
describe_feature | The file format and rules of a feature (designer, dashboards, schema_compare) — call it before proposing one. |
Resources, for clients that prefer them: tabellum://connections,
tabellum://schema/<connection>, tabellum://snapshots,
tabellum://dashboards, tabellum://designs.
What stays with the user: the server listens on loopback only and needs the
per-install token; every call is attributed in the app (a badge on the tab,
a line in the agent log); row data crosses the boundary only when the connection shares it;
and the engine, not the shim, refuses any statement that is not a read
without the user's approval.
License
Proprietary — see LICENSE. Free for commercial use below the
thresholds in Section 3; a paid license above them.