mcp-server-questdb
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_PATH | No | Override the log file location. | /tmp/questdb-mcp-bridge/<ISO-ts>-<pid>.log |
| LOG_LEVEL | No | Log level: ERROR, WARN, INFO, DEBUG. DEBUG adds heartbeats and full tool payloads. | INFO |
| CONSOLE_ORIGIN | No | QuestDB Web Console origin. Default is http://127.0.0.1:9000. '127.0.0.1' and 'localhost' are interchangeable. | http://127.0.0.1:9000 |
| MCP_BRIDGE_PORT | No | When specified, the bridge uses a fixed port. The port is bound on the first pairing attempt, pairing fails with a 'bridge_bind_failed' error if the port is taken. Leave unset for auto-allocation. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_pairing_credentialsA | Get the credentials the user needs to pair their browser with this MCP bridge — calling this tool does NOT itself pair anything. It returns a deep_link, ws_url, token, AND a pre-rendered |
| wait_for_pairingA | Poll for completion of pairing started by |
| get_tablesA | Get a list of all tables, materialized views, views and live views in the QuestDB database |
| get_table_schemaA | Get the full schema definition (DDL) for a specific table, materialized view, view or live view |
| get_table_detailsA | Get the runtime details/statistics of a specific table, materialized view, view or live view |
| validate_queryA | Validate the syntax correctness of a SQL query using QuestDB's SQL syntax validator. All generated SQL queries should be validated using this tool before responding to the user. |
| get_questdb_tocA | Get a table of contents listing all available QuestDB functions, operators, and SQL keywords. Use this first to see what documentation is available before requesting specific items. |
| get_questdb_documentationA | Get documentation for specific QuestDB functions, operators, or SQL keywords. This is much more efficient than loading all documentation. |
| create_notebookA | Create a new QuestDB notebook tab in the editor. You never see query data; this only scaffolds the tab and binds the current chat if it isn't already bound to a notebook. The tab is ALWAYS created in the background — you never switch the user's active tab. The user sees a notification and opens it themselves; only call activate_notebook if they explicitly ask to be taken there. |
| activate_notebookA | Switch the user's editor to the given notebook tab so it becomes visible and focused. ONLY call this after the user has explicitly agreed to be taken to the notebook (e.g. they accepted your offer to open it). Never call it to auto-switch while the user is working elsewhere. |
| duplicate_notebookA | Duplicate a notebook tab. Copies every cell (SQL, mode, chart config), layout, and run history into a NEW notebook labelled " (copy)" placed right after the original; cell ids are regenerated. Matching saved result snapshots are copied best-effort in the background and hydrate when the copy is opened. |
| delete_notebookA | Archive (soft-delete) a notebook tab — the same as the user closing it with the X. It moves to history and the user can restore it; it is not permanently destroyed and query data is untouched. If this notebook is bound to the current chat, the binding goes stale (start a new one with create_notebook). |
| list_cellsA | List the cells in a notebook. Returns id, type, short preview (≤120 chars), position, mode, and last-run status. Mode is the presented result kind: |
| get_cellA | Get full details of a cell (value, kind via |
| get_notebook_stateB | Full structural snapshot of a notebook (layout, cells with previews, semantic pane dimensions, kind via |
| add_cellA | Append a cell to the notebook. Returns the new cell id and, if run=true, a per-query status array with the same semantics as run_cell (reads run in parallel; an invalid statement is skipped with its error). Writes are never auto-run: a cell containing DDL/DML comes back |
| update_cellA | Replace a cell's value. Overwrites preemptively — cells are auto-saved. Results carry over by content: a statement whose text is unchanged keeps its result and its refresh state, an edited or added one starts empty, and a rewrite that leaves no statement unchanged clears the cell's results. Use to fix a broken SQL cell. When editing part of a long cell, base the new value on a non-truncated read (get_cell with get_full_content: true) — never on a preview or a |
| delete_cellC | Delete a cell from the notebook. |
| move_cell_upC | Swap a cell with the one above it. |
| move_cell_downA | Swap a cell with the one below it. |
| duplicate_cellB | Duplicate a cell immediately after the original. |
| run_cellA | Execute a SQL cell. A cell whose statements are all reads runs them in PARALLEL: one failure skips nothing, and a statement the server rejects at validation is skipped with its validation error as that statement's result. A cell containing any DDL/DML runs sequentially instead, and a failure stops the remaining statements. Returns |
| set_layout_modeB | Switch a notebook between list and grid layouts. |
| set_cell_layoutA | Position a single cell in grid mode. x/y/w are integers in the react-grid-layout grid; width is limited to 12 columns. Cell height is derived from its semantic pane dimensions. The response includes the applied grid position plus the cell's presented |
| set_cell_dimensionsA | Resize a cell using semantic pane dimensions in CSS pixels and choose its pane view. Every input field is required by strict tool calling: pass null to preserve the current setting. Pass "auto" for a height to restore automatic sizing, or a number to pin it. For SQL/draw cells, view accepts editor, result, or editor_result. view "editor" is DESTRUCTIVE: it discards the cell's result and snapshot and clears its presented mode — the same gesture as toggling off the table or chart in the UI; the response then carries mode:null and result_discarded:true. The stored result/editor_result arrangement is kept for the next result. A cell with nothing to show reports view "editor" and mode null. Markdown has no pane-view state: it reports |
| set_cell_modeA | Switch a SQL cell between run (table output) and draw (chart output). Draw cells auto-execute — do not call run_cell afterwards. MULTI-SERIES TIP: a draw-mode cell can hold multiple SELECT statements separated by |
| set_cell_chart_configA | Configure the chart for a draw-mode cell. The cell's |
| set_cell_highlight_configA | Set or clear the highlight rules of a run-mode cell's result grids (trend coloring): flash cells that moved up or down since the previous refresh, color threshold breaches, band values into steps, or shade a range. One config per cell, applied to every statement's grid by column name; a grid without the column is not affected. Replaces the whole config (PUT). |
| set_cell_autorefreshA | Set auto-refresh polling for a cell, as a per-cell override of the notebook default (set_notebook_autorefresh). Applies to both chart (draw-mode) and grid (run-mode) cells. A cell containing DDL/DML never polls: the value is stored, but the engine blocks its ticks and read tools report |
| set_notebook_autorefreshA | Set the notebook-level auto-refresh default for every cell showing a chart or a grid. Cells with no per-cell value inherit it; set_cell_autorefresh sets a per-cell override that wins over it. Cells containing DDL/DML are skipped — auto-refresh never executes a write. Until this is set, nothing polls. |
| set_cell_nameA | Set or clear a cell's name (its display label in the cell header). Applies to any cell; for a chart cell it is also the chart title. Pass null to clear. |
| apply_notebook_stateA | Bulk-apply the entire desired state of a notebook in one atomic call. Use this for bulk edits spanning multiple cells or creating a notebook from scratch. Use update_cell or set_cell_* for small operations. Use INSTEAD OF chained add_cell + update_cell + set_cell_mode + set_cell_chart_config only when composing a multi-cell layout from scratch, changing many cells at once, or restructuring an existing notebook. The cells array is the COMPLETE desired list: cells in the current notebook whose id is missing from your request are DELETED. For new cells, omit |
| set_cell_maximizedB | Spotlight one cell (or null to restore normal layout). Hides other cells in the notebook view. |
| run_queryA | Execute an arbitrary SQL statement against the user's QuestDB instance and return the result rows so you can inspect data, validate work, or compose follow-up queries. UNLIKE |
| get_workspace_stateA | If notebook tools fail with BRIDGE_NOT_PAIRED, call get_pairing_credentials to begin pairing (the response includes a one-click URL to show the user; authentication runs in the browser, the bridge never sees credentials). Once paired, call get_workspace_state at the start of every notebook turn; the digest of edits since your last fetch is in get_recent_user_actions. Return the current workspace + notebook context as text. Use this at the start of every notebook turn so you know which notebook is active, what cells exist, layout mode, chart configs, and last-run statuses. SQL/draw cells report their pane |
| get_recent_user_actionsA | If notebook tools fail with BRIDGE_NOT_PAIRED, call get_pairing_credentials to begin pairing (the response includes a one-click URL to show the user; authentication runs in the browser, the bridge never sees credentials). Once paired, call get_workspace_state at the start of every notebook turn; the digest of edits since your last fetch is in get_recent_user_actions. Return the digest of user edits to the notebook since your last fetch (or session start). Use this to detect that the user changed something the agent might want to react to. Coalesced — multiple typing events on the same cell collapse to a single 'edited' entry. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 36 tools
Most tools target distinct resources and actions, and descriptions proactively disambiguate the notable overlaps (apply_notebook_state vs add_cell/update_cell; run_cell vs run_query). However, the read surface has several overlapping 'state' tools — get_workspace_state, get_notebook_state, list_cells, and get_cell — that an agent could easily confuse, and set_cell_layout vs set_cell_dimensions require careful reading to tell apart.
Nearly all tools follow a predictable snake_case verb_noun pattern (get_cell, set_cell_mode, create_notebook, delete_cell, move_cell_up, run_query). Deviations like wait_for_pairing and the numbered/suffixed movers remain readable and consistent with the scheme.
36 tools is heavy for a single server and pushes past the comfortable 15-25 band. The domain (notebook+cell+layout+chart+autorefresh editing plus QuestDB schema/docs/pairing) partially justifies the breadth, but several fine-grained setters (set_cell_maximized, set_cell_name, set_cell_layout, set_cell_dimensions) inflate the count.
The surface covers notebook lifecycle, cell CRUD, layout/chart/highlight/autorefresh configuration, pairing, schema introspection, docs, and query validation/execution — a solid lifecycle for the domain. Minor gaps exist (no list_notebooks or rename_notebook, and cell data is only reachable via run_query), but agents can work around them.