# @mcpengine/airtable

Complete Airtable MCP Server providing full API integration for bases, tables, records, fields, views, webhooks, automations, and comments.

## Features

- **Bases**: List and get base information
- **Tables**: List tables, get table schema with all fields and views
- **Records**: Full CRUD operations with filtering, sorting, and pagination
- **Fields**: Access field definitions and types (all 34 field types supported)
- **Views**: List and access views (grid, form, calendar, gallery, kanban, timeline, gantt)
- **Webhooks**: Create, list, refresh, and delete webhooks
- **Comments**: Full comment management on records
- **Rate Limiting**: Automatic retry with exponential backoff (5 req/sec per base)
- **Pagination**: Offset-based for records, cursor-based for metadata
- **Batch Operations**: Create/update/delete up to 10 records per request

## Installation

```bash
npm install @mcpengine/airtable
```

## Configuration

### Environment Variables

Create a `.env` file:

```bash
AIRTABLE_API_KEY=your_api_key_here
```

Get your API key from: https://airtable.com/create/tokens

### MCP Settings

Add to your MCP settings file (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "airtable": {
      "command": "node",
      "args": ["/path/to/@mcpengine/airtable/dist/main.js"],
      "env": {
        "AIRTABLE_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

## Usage

### List Bases

```typescript
// Returns all bases accessible with the API key
airtable_list_bases({ offset?: string })
```

### List Tables

```typescript
// Get all tables in a base with schema
airtable_list_tables({ baseId: "appXXXXXXXXXXXXXX" })
```

### List Records

```typescript
// List records with filtering, sorting, and pagination
airtable_list_records({
  baseId: "appXXXXXXXXXXXXXX",
  tableIdOrName: "tblXXXXXXXXXXXXXX" || "Table Name",
  fields?: ["Field1", "Field2"],
  filterByFormula?: "{Status} = 'Done'",
  sort?: [{ field: "Name", direction: "asc" }],
  maxRecords?: 100,
  pageSize?: 100,
  view?: "Grid view",
  offset?: "itrXXXXXXXXXXXXXX/recXXXXXXXXXXXXXX"
})
```

### Create Records

```typescript
// Create up to 10 records at once
airtable_create_records({
  baseId: "appXXXXXXXXXXXXXX",
  tableIdOrName: "tblXXXXXXXXXXXXXX",
  records: [
    { fields: { Name: "John Doe", Email: "john@example.com" } },
    { fields: { Name: "Jane Smith", Email: "jane@example.com" } }
  ],
  typecast?: true  // Auto-convert types
})
```

### Update Records

```typescript
// Update up to 10 records at once
airtable_update_records({
  baseId: "appXXXXXXXXXXXXXX",
  tableIdOrName: "tblXXXXXXXXXXXXXX",
  records: [
    { id: "recXXXXXXXXXXXXXX", fields: { Status: "Complete" } }
  ],
  typecast?: true
})
```

### Delete Records

```typescript
// Delete up to 10 records at once
airtable_delete_records({
  baseId: "appXXXXXXXXXXXXXX",
  tableIdOrName: "tblXXXXXXXXXXXXXX",
  recordIds: ["recXXXXXXXXXXXXXX", "recYYYYYYYYYYYYYY"]
})
```

### Webhooks

```typescript
// Create a webhook
airtable_create_webhook({
  baseId: "appXXXXXXXXXXXXXX",
  notificationUrl: "https://your-server.com/webhook",
  specification: {
    options: {
      filters: {
        dataTypes: ["tableData"],
        recordChangeScope: "tblXXXXXXXXXXXXXX"
      }
    }
  }
})

// Refresh webhook (extends expiration)
airtable_refresh_webhook({
  baseId: "appXXXXXXXXXXXXXX",
  webhookId: "achXXXXXXXXXXXXXX"
})
```

### Comments

```typescript
// Create a comment on a record
airtable_create_comment({
  baseId: "appXXXXXXXXXXXXXX",
  tableIdOrName: "tblXXXXXXXXXXXXXX",
  recordId: "recXXXXXXXXXXXXXX",
  text: "This is a comment"
})
```

## Supported Field Types

All 34 Airtable field types are fully supported:

- **Text**: singleLineText, email, url, multilineText, richText, phoneNumber
- **Number**: number, percent, currency, rating, duration, autoNumber
- **Select**: singleSelect, multipleSelects
- **Date**: date, dateTime, createdTime, lastModifiedTime
- **Attachment**: multipleAttachments
- **Link**: multipleRecordLinks
- **User**: singleCollaborator, multipleCollaborators, createdBy, lastModifiedBy
- **Computed**: formula, rollup, count, lookup, multipleLookupValues
- **Other**: checkbox, barcode, button, externalSyncSource, aiText

## API Limits

- **Rate Limit**: 5 requests per second per base
- **Batch Create/Update**: Max 10 records per request
- **Batch Delete**: Max 10 record IDs per request
- **Page Size**: Max 100 records per page

Rate limiting is handled automatically with exponential backoff.

## Development

```bash
# Install dependencies
npm install

# Type check
npm run typecheck

# Build
npm run build

# Run
npm start
```

## Architecture

```
src/
├── types/index.ts       # All Airtable API types (bases, tables, records, fields, etc.)
├── clients/airtable.ts  # API client with rate limiting and pagination
├── server.ts            # MCP server with lazy-loaded tools
└── main.ts              # Entry point with dual transport support
```

## License

MIT

## Resources

- [Airtable API Documentation](https://airtable.com/developers/web/api/introduction)
- [Model Context Protocol](https://modelcontextprotocol.io)
- [Create API Token](https://airtable.com/create/tokens)
