The server provides 22 tools with consistent verb_noun naming (get_, list_, create_, update_, delete_, batch_) and all tools have input schemas with typed parameters. However, descriptions are uniformly terse (15-45 characters), well below the 50-200 character baseline for LLM-optimized tools. Parameter descriptions are present but minimal, most are 10-30 characters with no constraint information (ranges, enums, dependencies). Output schemas are undocumented; the code shows tools returning JSON text responses with no declared structure. Error handling is minimal, no recovery guidance, no error classification, and generic McpError wrapping. Authentication management is sound (secret injection via env vars), but no permission gating or audit logging. Tool composition is reasonable (22 single-purpose tools, clear chains: list → get → create/update/delete), but tool descriptions do not explain WHEN to use each tool or dependencies between them (e.g., baserow_configure must precede workspace operations). Batch operations exist (batch_create_rows, batch_update_rows, batch_delete_rows) but discovery/pagination tools lack limits or pagination hints.
Tools (22)
baserow_auth_loginwritesource verified64/100
Login with username and password to get JWT token
baserow_auth_set_tokenwritesource verified67/100
Manually set an authentication token (JWT or Database token)
Tool descriptions uniformly terse (15-45 characters); minimum actionable baseline is 50-100 chars. LLMs cannot determine WHEN to call each tool or distinguish similar tools (e.g., baserow_set_workspace vs baserow_configure). Current descriptions state WHAT but not WHEN or WHY.
Parameter descriptions lack constraint information. 'page' parameter has no min/max (should be ≥1). 'size' has no upper bound (API likely caps at 1000+, should be documented). 'search' and 'sorts' strings have no format guidance. LLMs will guess invalid values.
baserow_list_rows
Recommendations
Expand all tool descriptions to 80-150 characters. Include WHEN to use (e.g., 'Call this after listing workspaces to see workspace details'), any prerequisites, and what the tool returns structurally. Example: 'Get details of a specific workspace by ID. Returns workspace name, members, and associated databases. Call baserow_list_workspaces first to discover workspace IDs.'
Add constraint descriptions to all numeric/string parameters. For baserow_list_rows: 'page' → 'Page number for pagination (default: 1, min: 1)'; 'size' → 'Rows per page (default: 100, max: 1000)'; 'search' → 'Search query string (searched against all fields)'; 'sorts' → 'Sort fields as +fieldname (ascending) or -fieldname (descending), comma-separated (e.g., "+name,-updated").'
Document output schemas for all tools in tool descriptions or separate schema files. Example for baserow_get_table: 'Returns: { id: number, name: string, database_id: number, fields: [{ id: number, name: string, type: string, ... }] }'. This enables LLM to plan chaining and extract IDs.
Add actionable error messages. Replace generic McpError with specific guidance: 'Token expired, call baserow_auth_login() to refresh your JWT token.' 'Row not found in table 42, call baserow_list_rows(table_id: 42) to see available rows.' 'Workspace 999 not accessible, call baserow_list_workspaces() to discover available workspaces.'
Consolidate baserow_configure and baserow_set_workspace into a single tool with a clearer name (baserow_select_workspace or baserow_set_active_workspace). Update description to explain that this is a session-level preference for subsequent operations.
Output schemas undocumented. No tool explicitly declares what fields are returned (e.g., baserow_get_table should document that it returns 'id', 'name', 'fields' array with field objects). LLMs cannot plan downstream calls or extract chaining IDs without this information.
No error handling guidance. McpError wrapping is generic; no actionable recovery hints (e.g., 'Token expired, call baserow_auth_login with your credentials to refresh' or 'Row not found, call baserow_list_rows to discover available row IDs'). Agents cannot self-correct.
No permission gating or audit logging. Destructive operations (delete_row, batch_delete_rows) execute without user confirmation or permission checks. No audit trail of who called what. Compliance and incident response are blind.
List/discovery tools lack pagination limits or result count guidance. baserow_list_rows accepts 'size' but no documented cap. If a table has 100k rows and agent calls list without size, response could blow context window. No guidance on when to paginate or batch.
Conflicting or unclear tool purpose. 'baserow_configure' (set active workspace) vs 'baserow_set_workspace' (same function). 'baserow_auth_login' vs 'baserow_auth_set_token', both authenticate but via different methods. Descriptions do not clarify when to use each.
Parameter 'data' in create_row and update_row is declared additionalProperties:true with no schema for field values. LLM cannot infer valid field names or types without calling baserow_get_table first. No guidance linking these tools.
Consolidate baserow_auth_login and baserow_auth_set_token into a single 'baserow_auth' tool with a type parameter (credentials vs jwt vs database_token), or clarify in descriptions when LLM should choose one over the other.
Link creation and update tools to discovery tools in descriptions. For baserow_create_row: 'Data parameter accepts field names from the table schema. Call baserow_get_table(table_id) first to see available field names and types.'
Add result limits and pagination defaults to list tools. Update baserow_list_rows description: 'Returns up to 100 rows by default (configurable via size param, max 1000). Use page parameter to iterate. Always returns total count so LLM knows if more pages exist.'
Implement per-item error reporting in batch operations. Instead of failing all rows on first error, return { success: [{ id: 1, ... }], failed: [{ id: 2, error: 'Invalid field value' }] }. This prevents cascading failures.
Add scope/permission declarations to tools. Example: baserow_delete_row should note 'Requires: write permission on the table. If permission denied, error will state which scope is missing.' This guides LLM to handle permission errors gracefully.