Baserow MCP server for AI agents

Live

BEARER TOKEN

DATABASE TABLES

Productivity

Baserow gives your agent database table access: list tables and fields, search and filter rows, create, update, and move rows one at a time or in batches of 200, add fields, and upload files by URL.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Baserow
agent · Acme Q3
Run
Which leads in our Pipeline table are still marked New?
S
baserow_list_rows
94ms
Data agent
18 rows in Pipeline have Status set to New. 5 were added this week, all from the webinar signup form.
Sources: Pipeline table, 18 rows
baserow
18 rows
18:29
Message Claude...

Tools your data agent reaches for on Baserow, scoped per user.

CALL ANY TOOL
14 tools for database tables in Baserow: list tables and fields, search and filter rows, create, update, move, and delete rows, batch up to 200 rows at once, add fields, and upload files by URL.
baserow_batch_create_rows
Batch create rows
Create up to 200 rows in a table in one request. Returns the created rows in the same order as the request, each with its id. Use this for bulk inserts; use baserow_create_row for a single row.
Parameters
Name
Type
Required
Description
items
array
Required
List of row objects to create, from 1 to 200. Each object uses the same keys as baserow_create_row. Example: [{"Name": "Acme"}, {"Name": "Globex"}].
table_id
integer
Required
ID of the Baserow table. Get it from baserow_list_tables. Example: 1234.
before
integer
Optional
Place the new rows before the row with this id. Leave empty to add them at the end. Example: 42.
user_field_names
boolean
Optional
Set true to use field names (for example Name) as keys in the request and response. Leave empty to use Baserow's internal keys such as field_123. Use baserow_list_fields to see both.
baserow_batch_delete_rows
Batch delete rows
baserow_batch_update_rows
Batch update rows
baserow_check_token
Check token
baserow_create_field
Create field
baserow_create_row
Create row
baserow_delete_row
Delete row
baserow_get_row
Get row
baserow_list_fields
List fields
baserow_list_rows
List rows
baserow_list_tables
List tables
baserow_move_row
Move row
baserow_update_row
Update row
baserow_upload_file_via_url
Upload file via url
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Baserow tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["baserow"], toolNames: [
    "baserow_list_fields",
    "baserow_list_rows",
    "baserow_batch_update_rows"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Mark every Pipeline row closed before June as Archived" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["baserow"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Mark every Pipeline row closed before June as Archived" }],
  tools,
});

// Execute the tool call with the user's vaulted Baserow access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["baserow"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Mark every Pipeline row closed before June as Archived" }],
  tools,
});

// Tool call runs with the user's vaulted Baserow access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["baserow"] }, pageSize: 100,
});

const agent = new Agent({
  name: "data_agent",
  model: "gemini-2.5-pro",
  instruction: "Baserow tools scoped to this user",
  tools,
});

await agent.run("Mark every Pipeline row closed before June as Archived");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Baserow tool. Click to copy, paste into your agent, done.
Rows
Copy the prompt
Copied
List rows in the Pipeline table where Status is New.
Copy the prompt
Copied
Add a row to Pipeline for Acme with owner Priya and status Qualified.
Copy the prompt
Copied
Update row 42 in Pipeline to status Won.
Batches
Copy the prompt
Copied
Create these 25 leads as rows in the Pipeline table.
Copy the prompt
Copied
Set Status to Archived on every row closed before June.
Copy the prompt
Copied
Delete the 10 duplicate rows I listed.
Tables and fields
Copy the prompt
Copied
List every table I can access.
Copy the prompt
Copied
Show the fields and types in the Customers table.
Copy the prompt
Copied
Add a Renewal Date field to the Customers table.
SEE HOW AUTH WORKS
Each user connects their own Baserow access token once, and Scalekit sends it with every call. Access tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Baserow
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Baserow
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Baserow
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Baserow
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other database connectors.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
GTM and RevOps Teams
Deal room sync
Pulls opportunity context from Salesforce, captures key decisions from Slack, and syncs a running summary to the deal room doc in Google Drive, but only when the deal actually changed.
Test other agents
See the same per-user auth pattern across other database connectors.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
GTM
Deal room sync agent
Pull opportunity context from Salesforce, capture decisions from Slack, and keep the Google Drive deal room doc current.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Baserow access token looks fine in a demo. In production every row change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Baserow today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Baserow as the user or through a shared access token?
As the user. Each user connects their own Baserow access token once, and Scalekit sends it with every call. Audit logs attribute every row change to that user, not a shared service account.
Where is the Baserow access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Baserow?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example baserow_list_rows and baserow_get_row without baserow_batch_delete_rows, which deletes up to 200 rows in one request. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Baserow access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Baserow tables can the agent reach?
The tables the user's access token can reach. baserow_list_tables returns every one of them with its id, and baserow_check_token confirms the token is still valid before the agent starts work.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""baserow"": {
""url"": ""https://mcp.scalekit.com/baserow"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.baserow]
url = ""https://mcp.scalekit.com/baserow""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""baserow"": {
""url"": ""https://mcp.scalekit.com/baserow"",
""type"": ""http""
}
}
}