From 080d5b2637be25c541ca3822a65057e66cbb3cb6 Mon Sep 17 00:00:00 2001 From: Al Amin Date: Wed, 11 Nov 2026 18:41:24 +0100 Subject: [PATCH 1/5] docs: add skills for the new MCP tool areas Baserow's MCP server now has database structure, automation, dashboard, application builder, search, comment and audit log tools, and the plugin's single skill only covered rows. --- .claude-plugin/marketplace.json | 4 +- .claude-plugin/plugin.json | 2 +- .cursor-plugin/plugin.json | 2 +- CHANGELOG.md | 6 ++ GEMINI.md | 6 +- README.md | 23 +++++-- gemini-extension.json | 2 +- plugin.json | 6 +- scripts/build-openai-zip.sh | 2 +- server.json | 2 +- skills/baserow-app-builder/SKILL.md | 88 ++++++++++++++++++++++++++ skills/baserow-automations/SKILL.md | 95 +++++++++++++++++++++++++++++ skills/baserow-basics/SKILL.md | 95 +++++++++++++++++++---------- skills/baserow-dashboards/SKILL.md | 51 ++++++++++++++++ skills/baserow-databases/SKILL.md | 91 +++++++++++++++++++++++++++ skills/baserow-workspace/SKILL.md | 39 ++++++++++++ 16 files changed, 464 insertions(+), 50 deletions(-) create mode 100644 skills/baserow-app-builder/SKILL.md create mode 100644 skills/baserow-automations/SKILL.md create mode 100644 skills/baserow-dashboards/SKILL.md create mode 100644 skills/baserow-databases/SKILL.md create mode 100644 skills/baserow-workspace/SKILL.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index fbe1ec0..d4e0aae 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,12 +1,12 @@ { "name": "baserow", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server.", + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "owner": { "name": "Baserow", "url": "https://baserow.io" }, "plugins": [ { "name": "baserow", "source": "./", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server." + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server." } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index fb0b537..f828f4a 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "baserow", "displayName": "Baserow", "version": "0.1.1", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server.", + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", "repository": "https://github.com/baserow/baserow-mcp", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 316d829..6985e36 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "baserow", "displayName": "Baserow", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server.", + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "version": "0.1.1", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cf3c12..8b28b09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Each release is tagged `v`, matching the version in every manifest. Publishing a GitHub release for the tag publishes `server.json` to the MCP Registry. +## Unreleased + +- New skills: `baserow-databases`, `baserow-automations`, `baserow-dashboards`, `baserow-app-builder` and `baserow-workspace`, for the database, automation, dashboard, application builder, search, row comment and audit log tools. +- `baserow-basics` covers rows, the shared error format and undo, and tells users to turn missing tools on with Edit tools in Settings. +- README and listing descriptions cover the new tools, tool groups and Edit tools. + ## 0.1.1 (2026-10-16) - Baserow MCP server for Claude, ChatGPT, Codex, Cursor, VS Code, GitHub Copilot, Gemini CLI and other agents, with the `baserow-basics` skill. diff --git a/GEMINI.md b/GEMINI.md index 650bb88..4a3bdbb 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -1,5 +1,7 @@ # Baserow The `baserow` MCP server connects to one Baserow workspace, with the tools the user -allowed when they signed in. Before reading or changing table data, use the -`baserow-basics` skill. +allowed. Before using it, read the `baserow-basics` skill. Also use `baserow-databases` +for databases, tables, fields and views, `baserow-automations` for workflows, +`baserow-dashboards` for dashboards, `baserow-app-builder` for application builders, +and `baserow-workspace` for search, row comments and the audit log. diff --git a/README.md b/README.md index e378c25..e0eec54 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Baserow MCP -Connect your AI agent to [Baserow](https://baserow.io). Your agent can read and change tables in one Baserow workspace, using only the tools you allow when you sign in. +Connect your AI agent to [Baserow](https://baserow.io). Your agent can read and build databases, automations, dashboards and applications in one Baserow workspace, using only the tools you allow. -This repo installs Baserow's MCP server and a short skill that teaches the agent how to use it. It works with Claude, ChatGPT, Codex, Cursor, VS Code, GitHub Copilot, Gemini CLI, OpenCode, Zed, Goose, Windsurf, Pi and other agents. +This repo installs Baserow's MCP server and short skills that teach the agent how to use it: `baserow-basics` for rows and anything missing, `baserow-databases` for databases, tables, fields and views, `baserow-automations` for workflows, `baserow-dashboards` for dashboards, `baserow-app-builder` for application builders, and `baserow-workspace` for search, row comments and the audit log. It works with Claude, ChatGPT, Codex, Cursor, VS Code, GitHub Copilot, Gemini CLI, OpenCode, Zed, Goose, Windsurf, Pi and other agents. ## Server URL @@ -18,7 +18,7 @@ npx add-mcp https://api.baserow.io/mcp -n baserow -g npx skills add baserow/baserow-mcp ``` -`add-mcp` finds the agents you have installed and asks which ones to add Baserow to. Untick Claude Desktop if it's listed and add Baserow there as a [custom connector](#claudeai-and-claude-desktop) instead. `skills add` copies the `baserow-basics` skill into your agents' skill folders. On self-hosted Baserow, run `skills add` too, since only the plugins below include the skill. +`add-mcp` finds the agents you have installed and asks which ones to add Baserow to. Untick Claude Desktop if it's listed and add Baserow there as a [custom connector](#claudeai-and-claude-desktop) instead. `skills add` copies the skills into your agents' skill folders. On self-hosted Baserow, run `skills add` too, since only the plugins below include the skills. ## Self-hosted requirements @@ -108,7 +108,16 @@ To add only the server, without the plugin: ## Signing in -Your agent opens a Baserow page in your browser. Sign in, pick the workspace and tick the tools the agent may use. Read tools let the agent browse databases, tables and rows; write tools let it create, update and delete rows. Only the read tools are ticked on a first connection. +Your agent opens a Baserow page in your browser. Sign in, pick the workspace and tick the tools the agent may use. The tools are grouped by what they do: + +- **Workspace**: search everything the user can see. +- **Databases**: read databases, tables, fields, views, rows and row comments; create and change them, including view sorts, hidden fields and row colours, and post comments; delete rows, fields, views, filters and row colours. +- **Automations**: read workflows and their nodes; create automations and workflows, change nodes, and publish or pause workflows; delete nodes. +- **Dashboards**: read dashboards and widget figures; create dashboards and widgets and change them; delete widgets. +- **Application builders**: read pages, data sources, elements and actions; create and change applications, pages, elements, actions, styles and themes, and set up login; delete table columns and menu items. +- **Audit log**: read who did what in the workspace. Needs an advanced or enterprise licence and a workspace admin. + +The Read only preset is ticked on a first connection. It covers search and reading databases, dashboards and application builders, so turn on anything else you want the agent to use. Row comments, row colours and charts need a premium licence. Which tools you see depends on your Baserow version. Where the sign-in starts: @@ -117,11 +126,13 @@ Where the sign-in starts: - Gemini CLI: `/mcp auth baserow`. - Claude.ai, ChatGPT, Cursor and VS Code: the Connect or Sign in button next to the server. -To change the workspace or tools, sign in again: re-authenticate the server in your agent, or disconnect the app under My settings → MCP server in Baserow and connect again. A plain reconnect keeps the old sign-in. +To change the tools, click Edit tools next to the app under My settings → MCP server in Baserow. The app gets the change on its next request, without signing in again. New tools stay off for existing connections until you turn them on here. + +To change the workspace, sign in again: re-authenticate the server in your agent, or disconnect the app under My settings → MCP server and connect again. A plain reconnect keeps the old sign-in. Do the same to change the tools on a version without Edit tools. ## Troubleshooting -- **A tool is missing, or no databases are listed.** The connection only has the workspace and tools you picked at sign-in. Sign in again as described above. Tools that change tables or fields aren't available over MCP. +- **A tool is missing, or no databases are listed.** The connection only has the workspace and tools you picked. Turn the tool on with Edit tools, or sign in again for another workspace, as described above. Your agent may need a new session to see the change. - **The sign-in never starts, or the client says the server doesn't support OAuth or client registration.** On self-hosted Baserow, check the [self-hosted requirements](#self-hosted-requirements). - **The connection fails with a URL you typed.** Copy the URL exactly as My settings → MCP server shows it. It ends in `/mcp`, with no trailing slash. - **Two Baserow servers in Claude Code.** If `claude mcp list` shows the plugin's `plugin:baserow:baserow` and a `baserow` server you added by hand, keep the one that connects. `claude plugin disable baserow@baserow` turns off the plugin's; `claude mcp remove baserow` removes yours. diff --git a/gemini-extension.json b/gemini-extension.json index d3c53e1..357b76a 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,7 +1,7 @@ { "name": "baserow", "version": "0.1.1", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server.", + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "contextFileName": "GEMINI.md", "mcpServers": { "baserow": { diff --git a/plugin.json b/plugin.json index a25facf..c87e472 100644 --- a/plugin.json +++ b/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "baserow", "version": "0.1.1", - "description": "Read and change Baserow tables from your AI agent through Baserow's MCP server.", + "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", "repository": "https://github.com/baserow/baserow-mcp", @@ -18,8 +18,8 @@ "com.openai": { "interface": { "displayName": "Baserow", - "shortDescription": "Read and change Baserow tables", - "longDescription": "Connect a Baserow workspace to read and change table data. Look up databases, tables and fields, search and list rows, and create, update or delete rows. You sign in with your Baserow account, pick one workspace and choose which tools the agent may use; only read tools are ticked by default. Works with baserow.io; for self-hosted Baserow, add your own server URL as a custom MCP server.", + "shortDescription": "Work with Baserow databases, automations and apps", + "longDescription": "Connect a Baserow workspace to read and change its data. Search the workspace, read and change rows and their comments, build databases, tables, fields and views, build and publish automation workflows, build dashboards and application builder pages, and read the audit log. You sign in with your Baserow account, pick one workspace and choose which tools the agent may use; only search and the read tools for databases, dashboards and application builders are ticked by default. Works with baserow.io; for self-hosted Baserow, add your own server URL as a custom MCP server.", "developerName": "Baserow", "category": "Productivity", "capabilities": [ diff --git a/scripts/build-openai-zip.sh b/scripts/build-openai-zip.sh index 5b21a7e..55ddca7 100755 --- a/scripts/build-openai-zip.sh +++ b/scripts/build-openai-zip.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Builds the ZIP uploaded to the OpenAI Platform (Plugins → Upload): the Agent -# Plugins manifest, the MCP config, the skill and the logo. Nothing Claude-, Cursor- +# Plugins manifest, the MCP config, the skills and the logo. Nothing Claude-, Cursor- # or Gemini-specific, and no tooling. set -euo pipefail cd "$(dirname "$0")/.." diff --git a/server.json b/server.json index 17f1f25..4760c1d 100644 --- a/server.json +++ b/server.json @@ -2,7 +2,7 @@ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.baserow/baserow", "title": "Baserow", - "description": "Read and change Baserow tables.", + "description": "Read and build Baserow databases, automations, dashboards and applications.", "version": "0.1.1", "repository": { "url": "https://github.com/baserow/baserow-mcp", diff --git a/skills/baserow-app-builder/SKILL.md b/skills/baserow-app-builder/SKILL.md new file mode 100644 index 0000000..5890d61 --- /dev/null +++ b/skills/baserow-app-builder/SKILL.md @@ -0,0 +1,88 @@ +--- +name: baserow-app-builder +description: Use when the user asks to read, build or change a Baserow application builder (an app, website or portal) through the Baserow MCP server, including its pages, data sources, elements, buttons, forms, styles, theme and login. Read baserow-basics first for results and missing tools. +--- + +`list_builders`, `list_pages`, `list_data_sources`, `list_elements` and +`list_element_actions` are in "Read application builders", part of the "Read only" +preset. The create, update, move, style and theme tools are in "Edit application +builders", and `delete_element_items` is in "Delete in application builders". + +A request for an application, app or website means an application builder. Create one +with `create_builder`, then add pages with `create_pages`. There's no tool to delete an +application, a page or an element, or to publish an application: the user publishes it +in Baserow. + +## Reading first + +Call `list_pages` for a builder's pages, path parameters, login page, user sources and +roles. Then `list_data_sources`, `list_elements` and `list_element_actions` for a page. +Headers, footers and their data sources are on a shared page and show up with +`page_name` `"[shared]"`. + +## Building a page + +1. Create the pages with `create_pages`. A path like `/products/:id` adds `id` as a + text parameter unless `path_params` says `numeric`. +2. Connect the page to a table with `create_data_sources`: `list_rows` for many rows, + `get_row` for one. To filter or sort rows, point `view_id` at a database view; set + that view up first with the `baserow-databases` skill. +3. Add elements: `create_layout_elements` (column, simple_container, header, footer, + menu), `create_display_elements` (heading, text, button, link, image), + `create_collection_elements` (table, repeat) and `create_form_elements` + (form_container and its inputs). Put elements in a container with + `parent_element`, and in a column's slot with `place_in_container`, from `"0"`. +4. Give buttons and forms something to do with `create_element_actions`: show a + notification, open a page, create, update or delete a row, refresh a data source or + log out. A button does nothing until it has a click action, and a form_container + needs a `submit` action. + +`setup_page` does steps 2 to 4 for one page in one call. A ref only works inside the call +that creates it, and formulas need real IDs, so add anything that reads an input or data +source from that call in a second call, with the IDs it returned. Calling it again +creates everything again, so after errors resend only the failed items. + +## Formulas + +Give dynamic values as formulas; plain text is stored as fixed text. Use field IDs, never +field names: + +- `get('page_parameter.')` reads a page parameter. +- `get('current_record.field_')` reads the row inside a table or repeat, and + `get('current_record.id')` its ID. +- `get('form_data.')` reads a form input in an action. +- `get('previous_action..')` reads what an earlier action returned. + +In row actions, `row_id` and field values are always formulas, so quote fixed text: +`'like this'`. An invalid formula comes back in `formula_errors` and the value is left +empty or keeps what it had. Fix it with the matching update tool, such as +`update_element` or `update_element_action`. Don't create the action again: then both +run. + +## Links and page parameters + +A link, menu item or `open_page` action going to a page with path parameters must give +exactly those parameters, in `link_page_parameters` or `page_parameters`, or it's +refused. Menu items can't link to a page that has parameters; the user sets those in the +editor. When `update_page` changes a page's parameters, its result lists in +`navigations_to_fix` the links and actions to fix. + +## Changing + +`update_element` changes an element's text and settings, table columns +(`add_table_columns`, `update_table_columns`, `reorder_table_columns`) and menu items. It +deletes nothing: `delete_element_items` removes columns or menu items, with their click +actions, and can't be undone, so only remove what the user asked for. +`update_element_style` changes borders, spacing, colours and widths. `move_elements` +moves elements within their page. + +`set_theme` replaces every theme setting of the application and can't be undone, so ask +the user first. + +## Login + +`setup_user_source` lets people log in: it uses a table of users, or creates a Users +table with example rows, and sets up a login page with a login form. It writes to a +database, so tell the user what it will create. Each user needs a password before they +can log in. It comes with Baserow's enterprise edition, so some servers don't offer it. +Pages with `visibility` `logged-in` are only shown to logged-in users. diff --git a/skills/baserow-automations/SKILL.md b/skills/baserow-automations/SKILL.md new file mode 100644 index 0000000..26f2c5b --- /dev/null +++ b/skills/baserow-automations/SKILL.md @@ -0,0 +1,95 @@ +--- +name: baserow-automations +description: Use when the user asks to read, build, change, publish or pause Baserow automations, workflows or workflow nodes through the Baserow MCP server. Read baserow-basics first for results and missing tools. +--- + +Automation tools are off until the user turns them on, even with the "Read only" preset: +`list_workflows`, `list_nodes` are in "Read automations"; `create_automation`, +`update_automation`, `create_workflows`, `add_nodes`, `update_nodes`, +`publish_workflow`, `pause_workflow` are in "Edit automations"; `delete_nodes` is in +"Delete in automations". + +Call `list_workflows` to find automations and their workflows, and `list_nodes` before +changing a workflow. It returns each node's ID, type, position and output paths. Row +triggers and row actions need a `table_id` and field IDs, so call `get_table_schema` too. +If the workspace has no automation, create one with `create_automation`. + +## Building a workflow + +`create_workflows` takes a `name`, a `trigger` and `nodes`. Every trigger and node has a +`ref` of your choice, and each node names the node it follows in `previous_node_ref`. To +extend an existing workflow, use `add_nodes`, where `previous_node_ref` is a ref from the +same call or an existing node's ID as a string. + +- Triggers: `periodic` (with `periodic_interval`, in UTC), `http_trigger`, `rows_created`, + `rows_updated`, `rows_deleted` (with `rows_triggers_settings.table_id`). +- Nodes: `smtp_email`, `slack_write_message`, `create_row`, `update_row`, `delete_row`, + `ai_agent`, `router`. `update_row` and `delete_row` need a `row_id`. + +A router has `edges`, each with a `label` and a `condition`, and the first match wins. A +default branch is added for you. Attach a node to a branch with `router_edge_label`. + +```json +{ + "name": "Big orders", + "trigger": { "ref": "trigger", "type": "rows_created", "rows_triggers_settings": { "table_id": 12 } }, + "nodes": [ + { + "ref": "check", + "type": "router", + "previous_node_ref": "trigger", + "edges": [{ "label": "Big", "condition": "greater_than(get('previous_node.trigger.0.field_34'), 100)" }] + }, + { + "ref": "email", + "type": "smtp_email", + "previous_node_ref": "check", + "router_edge_label": "Big", + "to_emails": "sales@example.com", + "subject": "concat('Big order ', get('previous_node.trigger.0.id'))", + "body": "A big order came in." + } + ] +} +``` + +A workflow with the same name as an existing one isn't created or changed: it comes back +in `reused_workflows`. + +## Formulas + +A value that looks like a formula is stored as one, and anything else as plain text. To +store text that looks like a formula, send it as a quoted string, such as `'Call now()'`. A +router condition is always a formula. + +Read an earlier node with `get('previous_node....')`, where `` is an existing +node's ID or the ref of an earlier node in the same call. Use only paths `list_nodes` shows +for that node. A row trigger's rows are a list, so its fields are at +`get('previous_node..0.field_')` and the row ID is at +`get('previous_node..0.id')`. Don't use field names in these paths. + +An invalid formula comes back in `formula_errors` with the reason and the paths the node +does output. On a new node the value is left empty; on an update it keeps what it had. +Fix it with `update_nodes`, not by adding the node again. + +## Changing a workflow + +`update_nodes` changes labels, settings, a row action's table and values, and router +conditions by branch label. Values you leave out keep theirs. Give each node once, with all +its changes. It can't change a node's type or a trigger's settings. + +Show the user what will change before `update_nodes` or `delete_nodes`. `delete_nodes` moves +nodes to the trash, and a router with nodes on its branches can't be deleted. There's no +tool to delete a workflow or an automation. + +## Publishing + +A new workflow is a draft and doesn't run. `publish_workflow` makes the current version +live, and from then on it sends real emails and messages and writes real rows. Always get +the user's approval first, and check `warnings` in the result for misconfigured nodes. + +The live copy doesn't change when you edit the workflow: publish again to replace it. +`pause_workflow` stops a live workflow; events while it's paused are never run. +Publishing a paused workflow makes the current draft live, with any edits since. In +`list_workflows`, the state is that of the last published version, so a live workflow +can have edits that aren't running yet. diff --git a/skills/baserow-basics/SKILL.md b/skills/baserow-basics/SKILL.md index 4df3fab..62a6510 100644 --- a/skills/baserow-basics/SKILL.md +++ b/skills/baserow-basics/SKILL.md @@ -1,36 +1,67 @@ --- name: baserow-basics -description: Use when the user asks to read or change data in Baserow tables through the Baserow MCP server. +description: Use when the user asks anything of Baserow through the Baserow MCP server, such as reading or changing rows, or when a Baserow tool or database is missing. --- -Each Baserow connection is tied to one workspace and to the tools the user ticked -when they signed in. Only that workspace and those tools are available. - -Find data before changing it: call `list_databases`, then `list_tables`, then -`get_table_schema` for the table you need. Only use database and table IDs that -these calls returned; never guess an ID. Use field names exactly as the schema -returns them. - -Read rows with `list_table_rows` and a search term instead of reading the whole -table. It returns `count`, the total number of matching rows, and one page of at -most `size` rows (100 by default, 200 at most). When `count` is larger than the -rows you got, fetch the next `page` or narrow the search before saying a row -doesn't exist. Search may skip link-to-table, boolean, collaborator and duration -fields, so when a search on one of those values finds nothing, page through the -rows and compare the field yourself. - -Before `update_rows` or `delete_rows`, show the user which rows will change. Send -large changes in batches of at most 200 rows. Deleted rows go to the trash in -Baserow, where the user can restore them for 3 days by default; there is no undo -tool here. - -This server reads databases, tables and fields but only changes rows. You can't -create or change databases, tables or fields through it, so say so instead of -looking for a tool. - -If `list_databases` returns nothing, the connection points at a workspace without -databases. If a row tool you need is missing, it wasn't allowed at sign-in. In -both cases the user has to sign in again to pick another workspace or tick the -tool: re-authenticate the Baserow server in their agent (a plain reconnect keeps -the old sign-in), or disconnect the app under My settings → MCP server in Baserow -and connect again. Don't retry the call. +Each Baserow connection is tied to one workspace and to the tools the user allowed. +Only that workspace and those tools are available. Use any tool the server offers, +even if these skills don't mention it. For more specific work, also use: + +- `baserow-databases` to create or change databases, tables, fields, views, filters, + sorts and row colours. +- `baserow-automations` for automations and workflows. +- `baserow-dashboards` for dashboards and widgets. +- `baserow-app-builder` for application builders: pages, elements and login. +- `baserow-workspace` to search the whole workspace, for row comments and for the audit + log. + +## Finding things + +To find something by name or content anywhere in the workspace, use `search_workspace` +as the `baserow-workspace` skill describes. To walk a database, call `list_applications` +(`list_databases` on older servers), then `list_tables`, then `get_table_schema` for the +table you need. Only use IDs these calls returned; never guess an ID. Use field names +exactly as the schema returns them. + +## Rows + +Read rows with `list_table_rows` and a search term instead of reading the whole table. +It returns `count`, the total number of matching rows, and one page of at most `size` +rows (100 by default, 200 at most). When `count` is larger than the rows you got, fetch +the next `page` or narrow the search before saying a row doesn't exist. Search may skip +link-to-table, boolean, collaborator and duration fields, so when a search on one of +those values finds nothing, page through the rows and compare the field yourself. + +`create_rows` and `update_rows` take values by field name. Before `update_rows` or +`delete_rows`, show the user which rows will change. Send at most 200 rows a call. + +## Results and undo + +A call can succeed and still leave things out. When a result has `errors`, those items +failed and the others were saved; each error has a `code`, such as `not_found`, +`permission_denied`, `invalid_input` or `invalid_formula`, and a `message`. Read it +before telling the user it's done, and fix and resend only the failed items. + +Changes made through these tools can't be undone with Baserow's undo. Deleted rows, +fields, views, nodes and widgets go to the trash, where the user can restore them for 3 +days by default. A feature that needs a licence the user doesn't have says so; tell the +user instead of retrying. + +## Missing tools or data + +If `list_applications` returns nothing, the connection points at a workspace without +databases. To use another workspace, the user has to sign in again: re-authenticate the +Baserow server in their agent (a plain reconnect keeps the old sign-in), or disconnect +the app under My settings → MCP server in Baserow and connect again. + +If a tool you need is missing, it's turned off for this connection, or this Baserow +version doesn't have it. Don't retry the call. New tools stay off for existing +connections, and the "Read only" preset at sign-in only turns on search and the read +tools for databases, dashboards and application builders. Ask the user to click Edit +tools next to the app under My settings → MCP server, and turn on the group with the +tool, such as "Edit databases" or "Read automations". The change applies without +signing in again, though some agents need a new session to see it. If there's no Edit +tools button, the user has to sign in again as above. With an endpoint key, tools can +only be changed through the API. + +If no tool does what the user asks, say so and point them to Baserow. diff --git a/skills/baserow-dashboards/SKILL.md b/skills/baserow-dashboards/SKILL.md new file mode 100644 index 0000000..8646936 --- /dev/null +++ b/skills/baserow-dashboards/SKILL.md @@ -0,0 +1,51 @@ +--- +name: baserow-dashboards +description: Use when the user asks to read, build or change Baserow dashboards or their widgets, or asks for the figures a dashboard shows, through the Baserow MCP server. Read baserow-basics first for results and missing tools. +--- + +`list_dashboards`, `list_widgets` and `get_widget_data` are in "Read dashboards", part of +the "Read only" preset. `create_dashboard`, `update_dashboard`, `create_widgets` and +`update_widgets` are in "Edit dashboards", and `delete_widgets` is in "Delete in +dashboards". + +## Reading + +`list_dashboards` lists the dashboards and `list_widgets` what each widget shows: its type, +title, table, view, fields and aggregations. `get_widget_data` returns the figures as the +dashboard computes them now, for at most 20 widgets a call. A summary returns +`{"result": }`, and a chart returns `{"results": [...]}` with a row per category. +Numbers come as strings. A widget that can't compute returns `configured: false` and the +problem. + +## Building + +`create_dashboard` creates an empty dashboard and `update_dashboard` renames one. There's +no tool to delete a dashboard. + +Call `get_table_schema` first: widgets take field IDs. `create_widgets` adds at most 20 +widgets a call, of three types: + +- `summary`: one figure, a `field_id` and an `aggregation_type`. +- `chart`: one or more `series`, each a `field_id` and an `aggregation_type`, optionally + split by `group_by_field_id`. `chart_type` is `BAR` (the default) or `LINE`. +- `pie_chart`: like a chart, with `chart_type` `PIE` (the default) or `DOUGHNUT`. + +Charts and pie charts need a premium licence. Aggregations include `sum`, `average`, +`min`, `max`, `median`, `std_dev`, `variance`, `count`, `not_empty_count`, `empty_count` +and `unique_count`; which fit depends on the field type. `count` counts rows, and +`not_empty_count` counts rows where the field has a value. To aggregate only some rows, +give a `view_id` and filter that view with the `baserow-databases` skill. Widgets can't +have filters of their own. + +```json +{ "type": "summary", "title": "Open deals", "field_id": 41, "aggregation_type": "sum", "view_id": 7 } +{ "type": "chart", "title": "Revenue by stage", "series": [{ "field_id": 41, "aggregation_type": "sum" }], "group_by_field_id": 42 } +``` + +## Changing + +`update_widgets` changes only the values you give. `series` replaces all of a chart's +series, and `clear` removes `view_id` or `group_by_field_id`. A widget's type can't +change. `delete_widgets` moves widgets to the trash. Each widget is saved on its own, so +check `errors` for the ones that failed; an aggregation that doesn't fit a field comes +back with the ones that do. diff --git a/skills/baserow-databases/SKILL.md b/skills/baserow-databases/SKILL.md new file mode 100644 index 0000000..4e3fb4a --- /dev/null +++ b/skills/baserow-databases/SKILL.md @@ -0,0 +1,91 @@ +--- +name: baserow-databases +description: Use when the user asks to create or change Baserow databases, tables, fields, views, view filters, sorts, hidden fields or row colours through the Baserow MCP server. Read baserow-basics first for rows, results and missing tools. +--- + +These tools change the structure of a database. Creating and changing is in "Edit +databases"; `delete_fields`, `delete_views`, `delete_view_filters` and +`delete_row_colours` are in "Delete in databases". Both are off until the user turns +them on. + +Call `get_table_schema` before changing a table, and `list_views` before changing a +view. Fields, views, filters and sorts take field IDs; rows take field names. + +## Databases and tables + +`create_database` creates an empty database and `update_database` renames one. There's +no tool to delete a database or to rename or delete a table. + +Pass related tables in one `create_tables` call, so a `link_row` or `lookup` field can +name another table of the call. Each table needs a `name`, a `primary_field_name` +(always a text field) and `fields`. The reverse link field is created for you. A table +with the same name as an existing one isn't created: it comes back in `reused_tables`, +with the differences from what you asked for. + +Field types are `text`, `long_text`, `number`, `rating`, `boolean`, `date`, `link_row`, +`single_select`, `multiple_select`, `file`, `formula` and `lookup`. For example: + +```json +{ "name": "Status", "type": "single_select", "options": [{ "value": "Open", "color": "green" }] } +{ "name": "Project", "type": "link_row", "linked_table": "Projects" } +{ "name": "Client Name", "type": "lookup", "linked_table": "Clients", "target_field": "Name" } +{ "name": "Total", "type": "formula", "formula": "field('Price') * 2" } +``` + +A formula that doesn't parse isn't created. It comes back in `errors` with the code +`invalid_formula` and the parser's message: correct it and add it with `create_fields`. +List a table before any table whose lookup targets one of its formula or lookup fields, +or add that lookup afterwards with `create_fields`. + +## Fields + +`create_fields` adds fields to an existing table. `update_fields` renames fields and +changes their settings and select options (`add_options`, `update_options`, +`remove_options`; options you don't list stay). Removing an option clears it from every +row, so confirm with the user first. A field's type and a link's target table can't +change. Replacing the field loses its values, so ask the user before doing that. +`delete_fields` moves fields to the trash; a primary field can't be deleted. + +## Views + +A new table already has a grid view. `create_views` takes `grid`, `form`, `gallery`, +`kanban`, `calendar` or `timeline`. Each type needs its field: `column_field_id` (single +select) for kanban, `date_field_id` for calendar, `start_date_field_id` and +`end_date_field_id` with the same include time setting for timeline, and +`cover_field_id` (file) for gallery. A form shows only the fields in its +`field_options`. `public: true` makes a view readable by anyone with its link, so only +set it when the user asks. + +- `set_view_sorts` replaces all the sorts of a view, most important first. An empty + list removes them. +- `set_field_visibility` hides or shows fields. The primary field of a grid can't be + hidden. +- `add_row_colours` colours rows by a single select field or by conditions written like + filters, and needs a premium licence. Colours are blue, green, cyan, orange, yellow, + red, brown, purple, pink or gray, optionally with `light-`, `dark-` or `darker-` in + front; hex colours are refused. +- `delete_views`, `delete_view_filters` and `delete_row_colours` take the IDs + `list_views` shows. + +## Filters + +`create_view_filters` adds filters, and a view shows the rows that match all of them. +Each filter has a `field_id`, a `type` matching the field's type, an `operator` and a +`value`: + +| type | operators | value | +| --- | --- | --- | +| `text` | `equal`, `not_equal`, `contains`, `contains_not`, `empty`, `not_empty` | string | +| `number` | `equal`, `not_equal`, `higher_than`, `lower_than`, `empty`, `not_empty` | number | +| `date` | `equal`, `not_equal`, `after`, `before` | see below | +| `single_select`, `multiple_select` | `is_any_of`, `is_none_of` | list of option labels | +| `link_row` | `has`, `has_not` | row ID | +| `boolean` | `equal` | `true` or `false` | + +A date filter also takes a `mode`: an ISO date with `exact_date`, a whole number with +`nr_days_ago` and similar, and no value with `today` and similar. Pass the user's +`timezone`, such as `Europe/Amsterdam`, so `today` follows their day. Set `or_equal` to +`true` for "or equal to" on number and date filters. A filter that can't be applied +comes back in `errors` with the reason. + +To change a filter, delete it with `delete_view_filters` and add the new one. diff --git a/skills/baserow-workspace/SKILL.md b/skills/baserow-workspace/SKILL.md new file mode 100644 index 0000000..3b9cd13 --- /dev/null +++ b/skills/baserow-workspace/SKILL.md @@ -0,0 +1,39 @@ +--- +name: baserow-workspace +description: Use when the user asks to find something anywhere in their Baserow workspace, to read or post row comments, or who changed what (the audit log), through the Baserow MCP server. Read baserow-basics first for results and missing tools. +--- + +## Search + +`search_workspace` searches databases, tables, fields, rows, application builders, +automations, dashboards and agents by name or content, and returns only what the user +can access. Use it when the user names something without saying where it is. Narrow it +with `types`: `database`, `database_table`, `database_field`, `database_row`, `builder`, +`automation`, `dashboard` or `agent`. It returns at most 50 results a page; fetch the +next `page` before saying something doesn't exist. + +A row result has its `table_id` and `row_id` in its metadata. Use them with +`list_table_rows` or `get_table_schema` to read the row and its fields. Search data is +built in the background, so something created a moment ago may not show up yet. If +search finds nothing, look it up with the list tools instead. + +`search_workspace` is in "Search the workspace", part of the "Read only" preset. + +## Row comments + +`list_row_comments` reads a row's comments as plain text, newest first, in "Read +databases". `create_row_comments` posts plain text comments, at most 100 a call, in +"Edit databases". Mentions aren't supported. Both take the `table_id` and `row_id`, and +need a premium licence. Comments can't be edited or deleted with these tools, so show +the user the text before posting. + +## Audit log + +`list_audit_log` lists who did what in the workspace, newest first: the user, the +action and when. Filter by `query`, `user_id` or `action_types`, such as `create_table` +or `delete_rows`, and by time with `from_timestamp` and `to_timestamp`, in ISO format +with the user's timezone offset, like `2026-11-02T09:00:00+01:00`. + +It needs an advanced or enterprise licence, and only workspace admins can use it. It's +off unless the user turned on "Read the audit log", even with the "Read only" preset. It +only covers this workspace. If the user isn't an admin, say so rather than retrying. From d5f5da1a8d11a966c12e36bddc0afe0b1d6f33a8 Mon Sep 17 00:00:00 2001 From: Al Amin Date: Wed, 11 Nov 2026 18:51:45 +0100 Subject: [PATCH 2/5] fix: correct the dashboard examples and skill gaps found in testing Widgets need table_id, not every tool error has a code, and agents reached for the legacy list_databases and guessed the get_row data source path. --- skills/baserow-app-builder/SKILL.md | 2 ++ skills/baserow-basics/SKILL.md | 8 +++++--- skills/baserow-dashboards/SKILL.md | 10 +++++----- skills/baserow-databases/SKILL.md | 1 + 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/skills/baserow-app-builder/SKILL.md b/skills/baserow-app-builder/SKILL.md index 5890d61..bfe56c0 100644 --- a/skills/baserow-app-builder/SKILL.md +++ b/skills/baserow-app-builder/SKILL.md @@ -50,6 +50,8 @@ field names: - `get('page_parameter.')` reads a page parameter. - `get('current_record.field_')` reads the row inside a table or repeat, and `get('current_record.id')` its ID. +- `get('data_source..field_')` reads a `get_row` data source anywhere on its + page. - `get('form_data.')` reads a form input in an action. - `get('previous_action..')` reads what an earlier action returned. diff --git a/skills/baserow-basics/SKILL.md b/skills/baserow-basics/SKILL.md index 62a6510..879f7fc 100644 --- a/skills/baserow-basics/SKILL.md +++ b/skills/baserow-basics/SKILL.md @@ -38,9 +38,11 @@ those values finds nothing, page through the rows and compare the field yourself ## Results and undo A call can succeed and still leave things out. When a result has `errors`, those items -failed and the others were saved; each error has a `code`, such as `not_found`, -`permission_denied`, `invalid_input` or `invalid_formula`, and a `message`. Read it -before telling the user it's done, and fix and resend only the failed items. +failed and the others were saved. Each error says which item failed and why, and many +have a `code`, such as `not_found`, `permission_denied`, `invalid_input`, `conflict` or +`invalid_formula`. Read them before telling the user it's done, and fix and resend only +the failed items. A call that fails as a whole returns an error message instead, such as +"Not found in this workspace." or "Invalid arguments. …". Changes made through these tools can't be undone with Baserow's undo. Deleted rows, fields, views, nodes and widgets go to the trash, where the user can restore them for 3 diff --git a/skills/baserow-dashboards/SKILL.md b/skills/baserow-dashboards/SKILL.md index 8646936..a7980c7 100644 --- a/skills/baserow-dashboards/SKILL.md +++ b/skills/baserow-dashboards/SKILL.md @@ -14,7 +14,7 @@ dashboards". title, table, view, fields and aggregations. `get_widget_data` returns the figures as the dashboard computes them now, for at most 20 widgets a call. A summary returns `{"result": }`, and a chart returns `{"results": [...]}` with a row per category. -Numbers come as strings. A widget that can't compute returns `configured: false` and the +Numbers may come as strings. A widget that can't compute returns `configured: false` and the problem. ## Building @@ -22,8 +22,8 @@ problem. `create_dashboard` creates an empty dashboard and `update_dashboard` renames one. There's no tool to delete a dashboard. -Call `get_table_schema` first: widgets take field IDs. `create_widgets` adds at most 20 -widgets a call, of three types: +Call `get_table_schema` first: every widget needs the `table_id` it reads and field IDs +from that table. `create_widgets` adds at most 20 widgets a call, of three types: - `summary`: one figure, a `field_id` and an `aggregation_type`. - `chart`: one or more `series`, each a `field_id` and an `aggregation_type`, optionally @@ -38,8 +38,8 @@ give a `view_id` and filter that view with the `baserow-databases` skill. Widget have filters of their own. ```json -{ "type": "summary", "title": "Open deals", "field_id": 41, "aggregation_type": "sum", "view_id": 7 } -{ "type": "chart", "title": "Revenue by stage", "series": [{ "field_id": 41, "aggregation_type": "sum" }], "group_by_field_id": 42 } +{ "type": "summary", "title": "Open deals", "table_id": 12, "field_id": 41, "aggregation_type": "sum", "view_id": 7 } +{ "type": "chart", "title": "Revenue by stage", "table_id": 12, "series": [{ "field_id": 41, "aggregation_type": "sum" }], "group_by_field_id": 42 } ``` ## Changing diff --git a/skills/baserow-databases/SKILL.md b/skills/baserow-databases/SKILL.md index 4e3fb4a..cbe2e3b 100644 --- a/skills/baserow-databases/SKILL.md +++ b/skills/baserow-databases/SKILL.md @@ -13,6 +13,7 @@ view. Fields, views, filters and sorts take field IDs; rows take field names. ## Databases and tables +Find databases with `list_applications` (`list_databases` on older servers). `create_database` creates an empty database and `update_database` renames one. There's no tool to delete a database or to rename or delete a table. From 129da93915c797f353bfc28d9df077b72eac0e2f Mon Sep 17 00:00:00 2001 From: Al Amin Date: Wed, 11 Nov 2026 19:18:17 +0100 Subject: [PATCH 3/5] chore: release 1.0.0 The plugin now covers every tool area of Baserow's MCP server, which ships in Baserow 2.5.0. --- .claude-plugin/plugin.json | 2 +- .cursor-plugin/plugin.json | 2 +- CHANGELOG.md | 5 ++++- README.md | 4 ++-- gemini-extension.json | 2 +- plugin.json | 2 +- server.json | 2 +- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index f828f4a..36194ce 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "baserow", "displayName": "Baserow", - "version": "0.1.1", + "version": "1.0.0", "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 6985e36..2732ead 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "baserow", "displayName": "Baserow", "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", - "version": "0.1.1", + "version": "1.0.0", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", "repository": "https://github.com/baserow/baserow-mcp", diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b28b09..3d4a979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ Each release is tagged `v`, matching the version in every manifest. Publishing a GitHub release for the tag publishes `server.json` to the MCP Registry. -## Unreleased +## 1.0.0 (unreleased) + +Needs Baserow 2.5.0 or newer. + - New skills: `baserow-databases`, `baserow-automations`, `baserow-dashboards`, `baserow-app-builder` and `baserow-workspace`, for the database, automation, dashboard, application builder, search, row comment and audit log tools. - `baserow-basics` covers rows, the shared error format and undo, and tells users to turn missing tools on with Edit tools in Settings. diff --git a/README.md b/README.md index e0eec54..93f4be5 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ npx skills add baserow/baserow-mcp ## Self-hosted requirements -- A Baserow version newer than 2.4.1. Older versions don't have `/mcp` or sign-in; use an [endpoint key](#endpoint-keys) there. +- Baserow 2.5.0 or newer. Older versions don't have `/mcp` or sign-in; use an [endpoint key](#endpoint-keys) there. - `BASEROW_MCP_OAUTH_ENABLED=true` on the backend. It's off by default. - A public HTTPS backend URL, so hosted apps like Claude.ai and ChatGPT can reach it, and outbound HTTPS from the backend, which fetches the apps' client metadata. - Your reverse proxy sends `/mcp` and paths under `/mcp/`, `/oauth/`, `/.well-known/oauth-authorization-server` and `/.well-known/oauth-protected-resource` to the backend. Match `/mcp` exactly, not as a prefix: the frontend serves the sign-in page at `/mcp-authorize/`. @@ -139,7 +139,7 @@ To change the workspace, sign in again: re-authenticate the server in your agent ### Endpoint keys -Baserow 2.4.1 and older only accept an endpoint key, and the plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: +Baserow 2.4 and older only accept an endpoint key, and the plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: ``` npx add-mcp "" -t sse -n baserow -g -a claude-code diff --git a/gemini-extension.json b/gemini-extension.json index 357b76a..d3b6771 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "baserow", - "version": "0.1.1", + "version": "1.0.0", "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "contextFileName": "GEMINI.md", "mcpServers": { diff --git a/plugin.json b/plugin.json index c87e472..de0fcc1 100644 --- a/plugin.json +++ b/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "baserow", - "version": "0.1.1", + "version": "1.0.0", "description": "Read and build Baserow databases, automations, dashboards and applications from your AI agent through Baserow's MCP server.", "author": { "name": "Baserow", "url": "https://baserow.io" }, "homepage": "https://baserow.io", diff --git a/server.json b/server.json index 4760c1d..4324e73 100644 --- a/server.json +++ b/server.json @@ -3,7 +3,7 @@ "name": "io.baserow/baserow", "title": "Baserow", "description": "Read and build Baserow databases, automations, dashboards and applications.", - "version": "0.1.1", + "version": "1.0.0", "repository": { "url": "https://github.com/baserow/baserow-mcp", "source": "github" From cc0500f7166d42d40f0b67f4cd42b621e84b5033 Mon Sep 17 00:00:00 2001 From: Al Amin Date: Wed, 11 Nov 2026 19:18:46 +0100 Subject: [PATCH 4/5] docs: require Baserow 3.0.0 --- CHANGELOG.md | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d4a979..7740728 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Each release is tagged `v`, matching the version in every manifest. Pub ## 1.0.0 (unreleased) -Needs Baserow 2.5.0 or newer. +Needs Baserow 3.0.0 or newer. - New skills: `baserow-databases`, `baserow-automations`, `baserow-dashboards`, `baserow-app-builder` and `baserow-workspace`, for the database, automation, dashboard, application builder, search, row comment and audit log tools. diff --git a/README.md b/README.md index 93f4be5..493fd9a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ npx skills add baserow/baserow-mcp ## Self-hosted requirements -- Baserow 2.5.0 or newer. Older versions don't have `/mcp` or sign-in; use an [endpoint key](#endpoint-keys) there. +- Baserow 3.0.0 or newer. Older versions don't have `/mcp` or sign-in; use an [endpoint key](#endpoint-keys) there. - `BASEROW_MCP_OAUTH_ENABLED=true` on the backend. It's off by default. - A public HTTPS backend URL, so hosted apps like Claude.ai and ChatGPT can reach it, and outbound HTTPS from the backend, which fetches the apps' client metadata. - Your reverse proxy sends `/mcp` and paths under `/mcp/`, `/oauth/`, `/.well-known/oauth-authorization-server` and `/.well-known/oauth-protected-resource` to the backend. Match `/mcp` exactly, not as a prefix: the frontend serves the sign-in page at `/mcp-authorize/`. @@ -139,7 +139,7 @@ To change the workspace, sign in again: re-authenticate the server in your agent ### Endpoint keys -Baserow 2.4 and older only accept an endpoint key, and the plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: +Baserow versions before 3.0.0 only accept an endpoint key, and the plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: ``` npx add-mcp "" -t sse -n baserow -g -a claude-code From 54f72c16ff191ff61ebcb3dcece2fae5f36f500a Mon Sep 17 00:00:00 2001 From: Al Amin Date: Thu, 12 Nov 2026 11:32:01 +0100 Subject: [PATCH 5/5] fix: state the 3.0.0 minimum where users enter the URL and require a dated changelog Self-hosted users only saw the minimum in the README, and a release could be tagged with an undated changelog. --- .claude-plugin/plugin.json | 2 +- .github/workflows/release.yml | 8 ++++++++ CHANGELOG.md | 3 +-- README.md | 4 ++-- server.json | 2 +- skills/baserow-basics/SKILL.md | 5 ++--- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 36194ce..8ac2f33 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -11,7 +11,7 @@ "mcp_url": { "type": "string", "title": "Baserow MCP URL", - "description": "Keep the default for baserow.io. For self-hosted Baserow, copy it from Settings → MCP server. It ends in /mcp.", + "description": "Keep the default for baserow.io. For self-hosted Baserow 3.0.0 or newer, copy it from My settings → MCP server. It ends in /mcp.", "default": "https://api.baserow.io/mcp" } }, diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c078b36..dd1fb5b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,6 +39,14 @@ jobs: exit 1 fi + - name: Check the changelog dates this version + run: | + VERSION=$(node -p 'require("./server.json").version') + if ! grep -Eq "^## ${VERSION//./\\.} \([0-9]{4}-[0-9]{2}-[0-9]{2}\)$" CHANGELOG.md; then + echo "CHANGELOG.md has no dated '## $VERSION (YYYY-MM-DD)' heading" + exit 1 + fi + - name: Check the version isn't in the registry yet id: registry run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 7740728..aae90e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,8 @@ Each release is tagged `v`, matching the version in every manifest. Pub Needs Baserow 3.0.0 or newer. - - New skills: `baserow-databases`, `baserow-automations`, `baserow-dashboards`, `baserow-app-builder` and `baserow-workspace`, for the database, automation, dashboard, application builder, search, row comment and audit log tools. -- `baserow-basics` covers rows, the shared error format and undo, and tells users to turn missing tools on with Edit tools in Settings. +- `baserow-basics` covers rows, the shared error format and undo, and tells users to turn missing tools on with Edit tools under My settings → MCP server. - README and listing descriptions cover the new tools, tool groups and Edit tools. ## 0.1.1 (2026-10-16) diff --git a/README.md b/README.md index 493fd9a..1d25ec2 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ Where the sign-in starts: To change the tools, click Edit tools next to the app under My settings → MCP server in Baserow. The app gets the change on its next request, without signing in again. New tools stay off for existing connections until you turn them on here. -To change the workspace, sign in again: re-authenticate the server in your agent, or disconnect the app under My settings → MCP server and connect again. A plain reconnect keeps the old sign-in. Do the same to change the tools on a version without Edit tools. +To change the workspace, sign in again: re-authenticate the server in your agent, or disconnect the app under My settings → MCP server and connect again. A plain reconnect keeps the old sign-in. ## Troubleshooting @@ -139,7 +139,7 @@ To change the workspace, sign in again: re-authenticate the server in your agent ### Endpoint keys -Baserow versions before 3.0.0 only accept an endpoint key, and the plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: +Without sign-in, on a Baserow version older than the [self-hosted requirements](#self-hosted-requirements) or with `BASEROW_MCP_OAUTH_ENABLED` off, use an endpoint key. The plugin doesn't set this up. Copy the endpoint URL from My settings → MCP server. It ends in `/sse` and contains your key. Add it by hand to an agent that supports SSE servers, such as Claude Code, Cursor or VS Code; Codex and Goose don't: ``` npx add-mcp "" -t sse -n baserow -g -a claude-code diff --git a/server.json b/server.json index 4324e73..bd90962 100644 --- a/server.json +++ b/server.json @@ -35,7 +35,7 @@ "url": "https://{baserow_host}/mcp", "variables": { "baserow_host": { - "description": "Your self-hosted Baserow backend host, for example baserow.example.com", + "description": "Your self-hosted Baserow 3.0.0 or newer backend host, for example baserow.example.com", "isRequired": true } } diff --git a/skills/baserow-basics/SKILL.md b/skills/baserow-basics/SKILL.md index 879f7fc..84bb3a8 100644 --- a/skills/baserow-basics/SKILL.md +++ b/skills/baserow-basics/SKILL.md @@ -62,8 +62,7 @@ connections, and the "Read only" preset at sign-in only turns on search and the tools for databases, dashboards and application builders. Ask the user to click Edit tools next to the app under My settings → MCP server, and turn on the group with the tool, such as "Edit databases" or "Read automations". The change applies without -signing in again, though some agents need a new session to see it. If there's no Edit -tools button, the user has to sign in again as above. With an endpoint key, tools can -only be changed through the API. +signing in again, though some agents need a new session to see it. With an endpoint +key, tools can only be changed through the API. If no tool does what the user asks, say so and point them to Baserow.