UNPKG

@andrewlwn77/nocodb-mcp

Version:
520 lines (409 loc) 11.4 kB
# NocoDB MCP Server A Model Context Protocol (MCP) server that provides a comprehensive interface to NocoDB - the open source Airtable alternative. This server enables AI agents to interact with NocoDB databases, making it perfect for storing and managing operational data across multiple AI teams. ## Features - **Database Operations**: List and manage NocoDB bases/projects - **Table Management**: Create, list, and delete tables with custom schemas - **Column Management**: Add columns to existing tables with full type support - **Record CRUD**: Full create, read, update, delete operations on records - **Advanced Queries**: Filter, sort, search, and aggregate data - **View Management**: Create and use different views (Grid, Gallery, Form, etc.) - **Bulk Operations**: Insert multiple records at once - **File Attachments**: Upload files locally or from URLs, attach to records ## Installation ### Via NPM (Global) ```bash npm install -g @andrewlwn77/nocodb-mcp ``` ### Via NPX (No installation) ```bash npx @andrewlwn77/nocodb-mcp ``` ## Configuration ### Environment Variables Create a `.env` file in your project root: ```env # Required NOCODB_BASE_URL=http://localhost:8080 NOCODB_API_TOKEN=your_api_token_here # Optional NOCODB_DEFAULT_BASE=your_default_base_id ``` ### Getting Your API Token 1. Log into your NocoDB instance 2. Click on your profile icon 3. Select "API Tokens" 4. Create a new token with appropriate permissions ### MCP Configuration Add to your Claude Desktop configuration file: **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "nocodb": { "command": "npx", "args": ["@andrewlwn77/nocodb-mcp"], "env": { "NOCODB_BASE_URL": "http://localhost:8080", "NOCODB_API_TOKEN": "your_api_token_here" } } } } ``` Or if installed globally: ```json { "mcpServers": { "nocodb": { "command": "nocodb-mcp", "env": { "NOCODB_BASE_URL": "http://localhost:8080", "NOCODB_API_TOKEN": "your_api_token_here" } } } } ``` ## Available Tools ### Database Operations - `list_bases` - List all available databases/projects - `get_base_info` - Get detailed information about a specific base ### Table Management - `list_tables` - List all tables in a base - `get_table_info` - Get table schema and column information - `create_table` - Create a new table with custom schema - `delete_table` - Delete a table - `add_column` - Add a new column to an existing table - `delete_column` - Delete a column from a table ### Record Operations - `insert_record` - Insert a single record - `bulk_insert` - Insert multiple records at once - `get_record` - Retrieve a specific record by ID - `list_records` - List records with filtering and pagination - `update_record` - Update an existing record - `delete_record` - Delete a record - `search_records` - Full-text search across records ### Query Operations - `query` - Advanced filtering with multiple conditions - `aggregate` - Perform SUM, COUNT, AVG, MIN, MAX operations - `group_by` - Group records by a column ### View Management - `list_views` - List all views for a table - `create_view` - Create a new view - `get_view_data` - Get records from a specific view ### File Attachments - `upload_attachment` - Upload a local file to NocoDB storage - `upload_attachment_by_url` - Upload files from URLs - `attach_file_to_record` - Upload and attach a file to a record - `get_attachment_info` - Get attachment information from a record ## Usage Examples ### Creating a Table ```json { "tool": "create_table", "arguments": { "base_id": "p_abc123", "table_name": "customers", "columns": [ { "title": "Name", "uidt": "SingleLineText", "rqd": true }, { "title": "Email", "uidt": "Email", "unique": true }, { "title": "Revenue", "uidt": "Number", "dt": "decimal" }, { "title": "Status", "uidt": "SingleSelect", "dtxp": "'active','inactive','pending'" } ] } } ``` ### Adding Columns to Existing Tables The `add_column` tool allows you to dynamically add columns to existing tables. Here are some examples: #### Basic Column Types ```json { "tool": "add_column", "arguments": { "table_id": "table_id_here", "title": "Description", "uidt": "LongText" } } ``` #### Column with Constraints ```json { "tool": "add_column", "arguments": { "table_id": "table_id_here", "title": "Product Code", "uidt": "SingleLineText", "unique": true, "rqd": true } } ``` #### Select Column with Options ```json { "tool": "add_column", "arguments": { "table_id": "table_id_here", "title": "Priority", "uidt": "SingleSelect", "meta": { "options": [ {"title": "Low", "color": "#059669"}, {"title": "Medium", "color": "#d97706"}, {"title": "High", "color": "#dc2626"}, {"title": "Critical", "color": "#7c3aed"} ] } } } ``` #### Currency Column ```json { "tool": "add_column", "arguments": { "table_id": "table_id_here", "title": "Price", "uidt": "Currency", "meta": { "currency_code": "USD" } } } ``` For more column type examples, see [Column Types Examples](examples/column-types-example.md). ### Deleting Columns The `delete_column` tool allows you to remove columns from existing tables. You can identify the column to delete by either its ID or name. #### Delete by Column ID ```json { "tool": "delete_column", "arguments": { "table_id": "table_id_here", "column_id": "column_id_to_delete" } } ``` #### Delete by Column Name ```json { "tool": "delete_column", "arguments": { "table_id": "table_id_here", "column_name": "ColumnToDelete" } } ``` Note: The tool will search for columns matching either the `column_name` or `title` field, making it flexible for different naming conventions. ### Inserting Records ```json { "tool": "insert_record", "arguments": { "base_id": "p_abc123", "table_name": "customers", "data": { "Name": "Acme Corp", "Email": "contact@acme.com", "Revenue": 50000, "Status": "active" } } } ``` ### Querying with Filters ```json { "tool": "query", "arguments": { "base_id": "p_abc123", "table_name": "customers", "where": "(Status,eq,active)~and(Revenue,gt,10000)", "sort": ["-Revenue", "Name"], "fields": ["Name", "Email", "Revenue"], "limit": 10 } } ``` ### Aggregating Data ```json { "tool": "aggregate", "arguments": { "base_id": "p_abc123", "table_name": "customers", "column_name": "Revenue", "function": "sum", "where": "(Status,eq,active)" } } ``` ### File Upload Examples #### Upload a Local File ```json { "tool": "upload_attachment", "arguments": { "file_path": "/path/to/document.pdf", "storage_path": "documents/2024" } } ``` #### Upload from URL ```json { "tool": "upload_attachment_by_url", "arguments": { "urls": [ "https://example.com/image1.png", "https://example.com/image2.jpg" ], "storage_path": "images" } } ``` #### Attach File to Record ```json { "tool": "attach_file_to_record", "arguments": { "base_id": "p_abc123", "table_name": "products", "record_id": "42", "attachment_field": "ProductImages", "file_path": "/path/to/product-photo.jpg" } } ``` #### Get Attachment Information ```json { "tool": "get_attachment_info", "arguments": { "base_id": "p_abc123", "table_name": "products", "record_id": "42", "attachment_field": "ProductImages" } } ``` ## NocoDB Field Types Supported UI data types (uidt) for columns: ### Basic Types - `SingleLineText` - Short text field - `LongText` - Multi-line text - `Number` - Integer numeric values - `Decimal` - Decimal numbers with precision - `Checkbox` - Boolean true/false ### Date & Time - `Date` - Date without time - `DateTime` - Date with time - `Time` - Time only - `Duration` - Time duration ### Specialized Text - `Email` - Email addresses with validation - `URL` - Web links - `PhoneNumber` - Phone numbers (note: use "PhoneNumber" not "Phone") ### Numeric Types - `Currency` - Money values (requires `meta.currency_code`) - `Percent` - Percentage values - `Rating` - Star rating ### Selection Types - `SingleSelect` - Dropdown with single selection (requires `meta.options`) - `MultiSelect` - Multiple selections (requires `meta.options`) ### Advanced Types - `Attachment` - File uploads - `JSON` - JSON data storage ### Virtual/Computed Columns - `Formula` - Calculated fields - `Rollup` - Aggregate related records - `Lookup` - Lookup values from related records - `QrCode` - Generate QR codes (requires `meta.fk_qr_value_column_id`) - `Barcode` - Generate barcodes (requires `meta.fk_barcode_value_column_id`) ### Relational - `LinkToAnotherRecord` - Relationships between tables - `Links` - Many-to-many relationships ### Special Parameters for Column Types Some column types require additional parameters in the `meta` field: - **SingleSelect/MultiSelect**: `meta.options` array with `{title, color}` objects - **Currency**: `meta.currency_code` (e.g., "USD", "EUR") - **QrCode**: `meta.fk_qr_value_column_id` - ID of column to encode - **Barcode**: `meta.fk_barcode_value_column_id` - ID of column to encode, optional `meta.barcode_format` ## Filter Syntax NocoDB uses a specific syntax for filtering: - `(field,operator,value)` - Basic condition - `~and` - AND operator - `~or` - OR operator - `~not` - NOT operator ### Operators - `eq` - Equal to - `neq` - Not equal to - `gt` - Greater than - `ge` - Greater than or equal - `lt` - Less than - `le` - Less than or equal - `like` - Contains (use % for wildcards) - `nlike` - Does not contain - `null` - Is null - `notnull` - Is not null ### Examples - `(Status,eq,active)` - Status equals "active" - `(Revenue,gt,1000)~and(Status,eq,active)` - Revenue > 1000 AND Status = "active" - `(Name,like,%Corp%)` - Name contains "Corp" ## Development ### Building from Source ```bash # Clone the repository git clone https://github.com/your-org/nocodb-mcp.git cd nocodb-mcp # Install dependencies npm install # Build the project npm run build # Run in development mode npm run dev ``` ### Running Tests ```bash npm test ``` ## Error Handling The server provides detailed error messages for common issues: - Invalid API token - Base/table not found - Invalid column types - Network connectivity issues - Rate limiting ## Best Practices 1. **Use Views**: Create views for commonly accessed data subsets 2. **Batch Operations**: Use `bulk_insert` for multiple records 3. **Field Selection**: Specify only needed fields to reduce payload size 4. **Pagination**: Use limit/offset for large datasets 5. **Caching**: Consider caching frequently accessed data on the client side ## Limitations - Some advanced NocoDB features may not be exposed through this interface - Rate limits depend on your NocoDB instance configuration ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License MIT ## Support For issues and feature requests, please create an issue on the GitHub repository.