Quadratic

io.github.quadratichqPublished by GitHub account quadratichqv0.1.0Updated Oct 24, 2026

AI access to Quadratic spreadsheets: open files, run Python/SQL, query connected databases.

VerifiedStreamable HTTPWeb executableDatabasesData & Analytics

Overview

AI-generated overview

Hosted Quadratic MCP server that lets an assistant open, read and edit Quadratic spreadsheets, run Python/SQL and query connected databases.

What you can do
Authenticate the session with Quadratic through an OAuth device login flow and confirm it with a device code. List accessible files and read file metadata. Create files, open files to start an editing session, and close sessions. Run read-only queries on the open spreadsheet, including batched actions. Write to the open spreadsheet, with cell values coerced to strings.
When to use it
Useful when you want an assistant to work inside Quadratic spreadsheets: summarizing an existing file, building a spreadsheet from a CSV, adding Python code cells for analysis, or inspecting the schema of a connected database.
Requirements
A remote streamable HTTP endpoint at mcp.quadratichq.com; no local package or runtime is needed. A Quadratic account and completion of the OAuth device authorization flow (open the returned URL in a browser, then confirm with the device code) are required before file and data tools work. Network access is needed.
Before you install
The server asks you to authorize access to your Quadratic account through a browser login; only complete the flow if you trust the endpoint. The write tools create files and modify spreadsheet contents, and the files_write tool opens editing sessions, so changes can affect real data. Connected databases are queried through the spreadsheet, so data from those sources may be exposed to the assistant.

Installation

In SourceWeft

  1. Open Quadratic in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.quadratichq%2Fquadratic-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "quadratic": {
      "type": "http",
      "url": "https://mcp.quadratichq.com/mcp"
    }
  }
}

README

Quadratic MCP Cursor Plugin

This repository packages the hosted Quadratic MCP server as a Cursor plugin. Installing it connects Cursor to Quadratic spreadsheets through the production streamable HTTP MCP endpoint:

json
{  "mcpServers": {    "quadratic": {      "type": "streamable-http",      "url": "https://mcp.quadratichq.com/mcp"    }  }}

Included

  • plugins/quadratic-mcp/mcp.json adds the hosted Quadratic MCP server.
  • plugins/quadratic-mcp/rules/ provides light guidance for using Quadratic MCP safely.
  • plugins/quadratic-mcp/skills/ adds an on-demand spreadsheet workflow skill.
  • plugins/quadratic-mcp/assets/logo.svg is the marketplace logo.

Usage

After installing the plugin in Cursor, open a chat and ask to work with a Quadratic spreadsheet. If you are not authenticated yet, ask Cursor to run the Quadratic MCP auth tool with the login action and complete the device auth flow.

Example prompts:

  • "Open my Budget 2026 Quadratic file and summarize it."
  • "Create a Quadratic spreadsheet from this CSV."
  • "Add a Python code cell that analyzes sales by month."
  • "Show me the schema for my connected Postgres database."

Development

Validate the plugin manifest and referenced files:

bash
node scripts/validate-template.mjs

The marketplace manifest lives at .cursor-plugin/marketplace.json. The plugin manifest lives at plugins/quadratic-mcp/.cursor-plugin/plugin.json.

Source: README.md at commit cff4509

Tools

5

auth

Authenticate with Quadratic

Authenticate the MCP session with Quadratic. Actions: • login() — Start an OAuth device authorization flow. Returns a URL the user must open in a browser to authorize. The flow is completed by confirm_login. • confirm_login(device_code) — Complete an in-progress login by polling for user authorization. If the response indicates the user has not yet authorized, this action can be called again with the same device_code to continue polling. confirm_login is idempotent: if a later tool call reports "Not authenticated on this connection", call confirm_login again with the same device_code to re-establish auth (some clients use a new session per request, so the session that ran the tool may differ from the one that logged in). • set_token(token, email?) — Set a JWT directly (used when the OAuth device flow is not available). • logout() — Clear saved authentication for the current session.

Parametersactionrequiredparams

files_read

Read Quadratic Files

Read-only file metadata operations on Quadratic files the user has access to. No data is modified. Requires authentication. Actions: • list_files() — List all accessible files. • get_file_info(file_id) — Get metadata for a single file.

Parametersactionrequiredparams

files_write

Manage Quadratic Files

File management operations that create or modify state: create a new file, open an existing file to start an editing session, or close a session. Requires authentication. Actions: • open_file(file_id?, file_name?) — Open a file by UUID or name and start an editing session. Returns the file's web URL. • create_file(file_name, team_uuid?) — Create a new blank spreadsheet. If team_uuid is omitted, the user's first team is used. Returns the new file's UUID and web URL; the file must be opened with open_file before it can be edited. • close_file(file_id) — Close an active editing session.

Parametersactionrequiredparams

read_data

Read Spreadsheet Data

Read-only queries on the open spreadsheet. No data is modified. Safe to auto-approve. Call as {"action": "<name>", "params": {...}} — per-action params are listed in the Action Reference below. Special actions (not shown in the action enum): • batch — {"action": "batch", "params": {"actions": [{"action": "<name>", "params": {...}}, ...]}}. Runs reads in parallel; individual failures are reported per-entry without short-circuiting. • context — {"action": "context", "params": {"topic": "<name>"}} or {"action": "context", "params": {"action": "<name>"}}. Returns deeper docs for a topic or a single action's signature. Plural "topics" / "actions" arrays are also accepted and may be combined. Topics: python, javascript, formula, connection, validation, a1, quadratic, chart, pivot_table. Action Reference • get_cell_data(selection, page?, sheet_name?) — Returns cell values for a selection in A1 notation. Supports comma-separated ranges to fetch multiple areas in ONE call, including across different sheets. Examples: "A1:B10, D1:E10", "TableName, OtherTable", "'Sheet1'!A1:B10, 'Sheet2'!C1:D10". Table names are globally unique so they work without sheet prefixes. For cell ranges on other sheets use 'SheetName'!Range. Only use when you need the full dataset (aggregations, lookups, analysis). The file summary already includes sample rows. Results may be paginated — use page (0-based) for additional pages. • has_cell_data(selection, sheet_name?) — Check if any cells in a selection have data. Returns true if ANY cell contains data. Use before creating/moving tables or code to avoid spill errors. All ranges MUST be on the same sheet. • get_code_cell_value(code_cell_position?, code_cell_name?, sheet_name?) — Get full code from an existing Python, JavaScript, or connection code cell. Do NOT use for formula cells — formulas are already in get_cell_data results and the file summary. • get_text_formats(selection, page?, sheet_name?) — Get text formatting info. Use table column refer

Parametersactionrequiredparams

write_data

Write Spreadsheet Data

Write operations on the open spreadsheet. Call as {"action": "<name>", "params": {...}} — per-action params are listed in the Action Reference below. Numbers, booleans, and nulls in cell values are coerced to strings. Special actions (not shown in the action enum): • batch — {"action": "batch", "params": {"actions": [{"action": "<name>", "params": {...}}, ...]}}. Runs writes sequentially; errors short-circuit the batch. • context — {"action": "context", "params": {"topic": "<name>"}} or {"action": "context", "params": {"action": "<name>"}}. Returns deeper docs for a topic or a single action's signature. Plural "topics" / "actions" arrays are also accepted and may be combined. Topics: python, javascript, formula, connection, validation, a1, quadratic, chart, pivot_table. Action Reference Cell Data: • set_cell_values(top_left_position, cell_values, sheet_name?) — Sets cell values as a 2D string array (first row = headers). top_left_position: single cell in A1 notation. Don't place over existing data unless requested. Values replace existing content; use empty string to clear. For merged cells, place at the anchor (top-left) cell. Prefer this over add_data_table for tabular data; only use add_data_table when the user explicitly asks for a data table or the file already uses data tables. When writing tabular data as plain cells, format the header row afterward with set_text_formats (at least bold) so it's visually distinct — plain cells don't auto-style headers like data tables do. Don't use for formulas or code. • delete_cells(selection, sheet_name?) — Delete cell values in a selection (A1 notation). Don't delete cells referenced by code cells unless explicitly asked. To delete table columns: "TableName[Column Name]". To delete tables: "TableName". • move_cells(source_selection_rect, target_top_left_position, sheet_name?) — Move a rectangular block of cells. Target is the top-left corner (single cell). For spilled code cells, move just the anchor cell. • add_data_ta

Parametersactionrequiredparams

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts