@rashidazarang/airtable-mcp 1.6.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/airtable_simple_production.js +532 -0
- package/package.json +15 -6
- package/.claude/settings.local.json +0 -12
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/custom.md +0 -10
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/CAPABILITY_REPORT.md +0 -118
- package/CLAUDE_INTEGRATION.md +0 -96
- package/CONTRIBUTING.md +0 -81
- package/DEVELOPMENT.md +0 -190
- package/Dockerfile +0 -39
- package/Dockerfile.node +0 -20
- package/IMPROVEMENT_PROPOSAL.md +0 -371
- package/INSTALLATION.md +0 -183
- package/ISSUE_RESPONSES.md +0 -171
- package/MCP_REVIEW_SUMMARY.md +0 -142
- package/QUICK_START.md +0 -60
- package/RELEASE_NOTES_v1.2.0.md +0 -50
- package/RELEASE_NOTES_v1.2.1.md +0 -40
- package/RELEASE_NOTES_v1.2.2.md +0 -48
- package/RELEASE_NOTES_v1.2.3.md +0 -105
- package/RELEASE_NOTES_v1.2.4.md +0 -60
- package/RELEASE_NOTES_v1.4.0.md +0 -104
- package/RELEASE_NOTES_v1.5.0.md +0 -185
- package/RELEASE_NOTES_v1.6.0.md +0 -248
- package/SECURITY_NOTICE.md +0 -40
- package/airtable-mcp-1.1.0.tgz +0 -0
- package/airtable_enhanced.js +0 -499
- package/airtable_mcp/__init__.py +0 -5
- package/airtable_mcp/src/server.py +0 -329
- package/airtable_simple_v1.2.4_backup.js +0 -277
- package/airtable_v1.4.0.js +0 -654
- package/cleanup.sh +0 -71
- package/index.js +0 -179
- package/inspector.py +0 -148
- package/inspector_server.py +0 -337
- package/publish-steps.txt +0 -27
- package/quick_test.sh +0 -30
- package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
- package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
- package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
- package/requirements.txt +0 -10
- package/setup.py +0 -29
- package/simple_airtable_server.py +0 -151
- package/smithery.yaml +0 -45
- package/test_all_features.sh +0 -146
- package/test_all_operations.sh +0 -120
- package/test_client.py +0 -70
- package/test_enhanced_features.js +0 -389
- package/test_mcp_comprehensive.js +0 -163
- package/test_mock_server.js +0 -180
- package/test_v1.4.0_final.sh +0 -131
- package/test_v1.5.0_comprehensive.sh +0 -96
- package/test_v1.5.0_final.sh +0 -224
- package/test_v1.6.0_comprehensive.sh +0 -187
- package/test_webhooks.sh +0 -105
package/IMPROVEMENT_PROPOSAL.md
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
# Airtable MCP Improvement Proposal
|
|
2
|
-
|
|
3
|
-
## Current State Analysis
|
|
4
|
-
|
|
5
|
-
### Existing Tools (v1.2.4)
|
|
6
|
-
1. **list_tables** - Lists all tables in a base
|
|
7
|
-
2. **list_records** - Lists records from a specific table
|
|
8
|
-
|
|
9
|
-
### Missing Core CRUD Operations
|
|
10
|
-
The MCP currently only supports READ operations. We need full CRUD capabilities.
|
|
11
|
-
|
|
12
|
-
## Proposed New Features
|
|
13
|
-
|
|
14
|
-
### 🔥 Priority 1: Complete CRUD Operations
|
|
15
|
-
|
|
16
|
-
#### 1. **create_record**
|
|
17
|
-
Create new records in any table
|
|
18
|
-
```javascript
|
|
19
|
-
{
|
|
20
|
-
name: "create_record",
|
|
21
|
-
params: {
|
|
22
|
-
table: "string",
|
|
23
|
-
fields: "object"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
#### 2. **update_record**
|
|
29
|
-
Update existing records
|
|
30
|
-
```javascript
|
|
31
|
-
{
|
|
32
|
-
name: "update_record",
|
|
33
|
-
params: {
|
|
34
|
-
table: "string",
|
|
35
|
-
recordId: "string",
|
|
36
|
-
fields: "object"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
#### 3. **delete_record**
|
|
42
|
-
Delete records from tables
|
|
43
|
-
```javascript
|
|
44
|
-
{
|
|
45
|
-
name: "delete_record",
|
|
46
|
-
params: {
|
|
47
|
-
table: "string",
|
|
48
|
-
recordId: "string"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
#### 4. **batch_operations**
|
|
54
|
-
Perform bulk create/update/delete (up to 10 records)
|
|
55
|
-
```javascript
|
|
56
|
-
{
|
|
57
|
-
name: "batch_operations",
|
|
58
|
-
params: {
|
|
59
|
-
table: "string",
|
|
60
|
-
operation: "create|update|delete",
|
|
61
|
-
records: "array"
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 🚀 Priority 2: Advanced Query & Filter
|
|
67
|
-
|
|
68
|
-
#### 5. **search_records**
|
|
69
|
-
Search with complex filters and sorting
|
|
70
|
-
```javascript
|
|
71
|
-
{
|
|
72
|
-
name: "search_records",
|
|
73
|
-
params: {
|
|
74
|
-
table: "string",
|
|
75
|
-
filterByFormula: "string", // Airtable formula syntax
|
|
76
|
-
sort: [{field: "string", direction: "asc|desc"}],
|
|
77
|
-
maxRecords: "number",
|
|
78
|
-
fields: ["string"] // Specific fields to return
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
#### 6. **get_record_by_id**
|
|
84
|
-
Get a single record by its ID
|
|
85
|
-
```javascript
|
|
86
|
-
{
|
|
87
|
-
name: "get_record_by_id",
|
|
88
|
-
params: {
|
|
89
|
-
table: "string",
|
|
90
|
-
recordId: "string"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 📊 Priority 3: Schema Management
|
|
96
|
-
|
|
97
|
-
#### 7. **get_table_schema**
|
|
98
|
-
Get detailed field information for a table
|
|
99
|
-
```javascript
|
|
100
|
-
{
|
|
101
|
-
name: "get_table_schema",
|
|
102
|
-
params: {
|
|
103
|
-
table: "string"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
#### 8. **create_table**
|
|
109
|
-
Create a new table in the base
|
|
110
|
-
```javascript
|
|
111
|
-
{
|
|
112
|
-
name: "create_table",
|
|
113
|
-
params: {
|
|
114
|
-
name: "string",
|
|
115
|
-
fields: [{name: "string", type: "string", options: "object"}]
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
#### 9. **create_field**
|
|
121
|
-
Add a new field to an existing table
|
|
122
|
-
```javascript
|
|
123
|
-
{
|
|
124
|
-
name: "create_field",
|
|
125
|
-
params: {
|
|
126
|
-
table: "string",
|
|
127
|
-
field: {name: "string", type: "string", options: "object"}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 🔄 Priority 4: Data Management
|
|
133
|
-
|
|
134
|
-
#### 10. **export_table**
|
|
135
|
-
Export entire table as JSON/CSV
|
|
136
|
-
```javascript
|
|
137
|
-
{
|
|
138
|
-
name: "export_table",
|
|
139
|
-
params: {
|
|
140
|
-
table: "string",
|
|
141
|
-
format: "json|csv"
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
#### 11. **import_data**
|
|
147
|
-
Import data from JSON/CSV
|
|
148
|
-
```javascript
|
|
149
|
-
{
|
|
150
|
-
name: "import_data",
|
|
151
|
-
params: {
|
|
152
|
-
table: "string",
|
|
153
|
-
data: "string|array",
|
|
154
|
-
format: "json|csv",
|
|
155
|
-
updateExisting: "boolean"
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
#### 12. **duplicate_table**
|
|
161
|
-
Clone a table with or without data
|
|
162
|
-
```javascript
|
|
163
|
-
{
|
|
164
|
-
name: "duplicate_table",
|
|
165
|
-
params: {
|
|
166
|
-
sourceTable: "string",
|
|
167
|
-
newName: "string",
|
|
168
|
-
includeData: "boolean"
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 🔗 Priority 5: Relationships & Links
|
|
174
|
-
|
|
175
|
-
#### 13. **link_records**
|
|
176
|
-
Create links between records in linked fields
|
|
177
|
-
```javascript
|
|
178
|
-
{
|
|
179
|
-
name: "link_records",
|
|
180
|
-
params: {
|
|
181
|
-
sourceTable: "string",
|
|
182
|
-
sourceRecordId: "string",
|
|
183
|
-
linkField: "string",
|
|
184
|
-
targetRecordIds: ["string"]
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
#### 14. **get_linked_records**
|
|
190
|
-
Fetch all records linked from a specific record
|
|
191
|
-
```javascript
|
|
192
|
-
{
|
|
193
|
-
name: "get_linked_records",
|
|
194
|
-
params: {
|
|
195
|
-
table: "string",
|
|
196
|
-
recordId: "string",
|
|
197
|
-
linkField: "string"
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### 📈 Priority 6: Analytics & Aggregation
|
|
203
|
-
|
|
204
|
-
#### 15. **aggregate_data**
|
|
205
|
-
Perform aggregations on table data
|
|
206
|
-
```javascript
|
|
207
|
-
{
|
|
208
|
-
name: "aggregate_data",
|
|
209
|
-
params: {
|
|
210
|
-
table: "string",
|
|
211
|
-
aggregations: [{
|
|
212
|
-
field: "string",
|
|
213
|
-
function: "sum|avg|count|min|max"
|
|
214
|
-
}],
|
|
215
|
-
groupBy: ["string"]
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
#### 16. **get_table_stats**
|
|
221
|
-
Get statistics about a table
|
|
222
|
-
```javascript
|
|
223
|
-
{
|
|
224
|
-
name: "get_table_stats",
|
|
225
|
-
params: {
|
|
226
|
-
table: "string"
|
|
227
|
-
}
|
|
228
|
-
// Returns: record count, field types, storage size, etc.
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### 🔍 Priority 7: Views Management
|
|
233
|
-
|
|
234
|
-
#### 17. **list_views**
|
|
235
|
-
List all views in a table
|
|
236
|
-
```javascript
|
|
237
|
-
{
|
|
238
|
-
name: "list_views",
|
|
239
|
-
params: {
|
|
240
|
-
table: "string"
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
#### 18. **get_view_records**
|
|
246
|
-
Get records from a specific view
|
|
247
|
-
```javascript
|
|
248
|
-
{
|
|
249
|
-
name: "get_view_records",
|
|
250
|
-
params: {
|
|
251
|
-
table: "string",
|
|
252
|
-
view: "string"
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### 🎨 Priority 8: Attachments & Media
|
|
258
|
-
|
|
259
|
-
#### 19. **upload_attachment**
|
|
260
|
-
Upload files to attachment fields
|
|
261
|
-
```javascript
|
|
262
|
-
{
|
|
263
|
-
name: "upload_attachment",
|
|
264
|
-
params: {
|
|
265
|
-
table: "string",
|
|
266
|
-
recordId: "string",
|
|
267
|
-
field: "string",
|
|
268
|
-
fileUrl: "string|base64"
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
#### 20. **get_attachments**
|
|
274
|
-
Download attachments from records
|
|
275
|
-
```javascript
|
|
276
|
-
{
|
|
277
|
-
name: "get_attachments",
|
|
278
|
-
params: {
|
|
279
|
-
table: "string",
|
|
280
|
-
recordId: "string",
|
|
281
|
-
field: "string"
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
## Implementation Roadmap
|
|
287
|
-
|
|
288
|
-
### Phase 1 (Version 1.3.0) - Essential CRUD
|
|
289
|
-
- ✅ create_record
|
|
290
|
-
- ✅ update_record
|
|
291
|
-
- ✅ delete_record
|
|
292
|
-
- ✅ get_record_by_id
|
|
293
|
-
- ✅ search_records
|
|
294
|
-
|
|
295
|
-
### Phase 2 (Version 1.4.0) - Batch & Schema
|
|
296
|
-
- batch_operations
|
|
297
|
-
- get_table_schema
|
|
298
|
-
- export_table
|
|
299
|
-
- import_data
|
|
300
|
-
|
|
301
|
-
### Phase 3 (Version 1.5.0) - Advanced Features
|
|
302
|
-
- create_table
|
|
303
|
-
- create_field
|
|
304
|
-
- link_records
|
|
305
|
-
- get_linked_records
|
|
306
|
-
|
|
307
|
-
### Phase 4 (Version 2.0.0) - Enterprise Features
|
|
308
|
-
- aggregate_data
|
|
309
|
-
- Views management
|
|
310
|
-
- Attachments handling
|
|
311
|
-
- Webhooks support
|
|
312
|
-
|
|
313
|
-
## Technical Considerations
|
|
314
|
-
|
|
315
|
-
### Rate Limiting
|
|
316
|
-
- Implement request queuing to respect 5 req/sec limit
|
|
317
|
-
- Add retry logic with exponential backoff
|
|
318
|
-
- Cache frequently accessed data
|
|
319
|
-
|
|
320
|
-
### Error Handling
|
|
321
|
-
- Detailed error messages for debugging
|
|
322
|
-
- Graceful fallbacks for missing permissions
|
|
323
|
-
- Validation of input parameters
|
|
324
|
-
|
|
325
|
-
### Performance
|
|
326
|
-
- Implement pagination for large datasets
|
|
327
|
-
- Add optional field filtering to reduce payload
|
|
328
|
-
- Support streaming for large exports
|
|
329
|
-
|
|
330
|
-
### Security
|
|
331
|
-
- Validate all input to prevent injection
|
|
332
|
-
- Support field-level permissions
|
|
333
|
-
- Add optional audit logging
|
|
334
|
-
|
|
335
|
-
## Usage Examples
|
|
336
|
-
|
|
337
|
-
### Creating a Record
|
|
338
|
-
```
|
|
339
|
-
"Create a new task in the Tasks table with title 'Review proposal' and status 'In Progress'"
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
### Complex Search
|
|
343
|
-
```
|
|
344
|
-
"Find all high-priority tasks assigned to John that are due this week"
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### Bulk Operations
|
|
348
|
-
```
|
|
349
|
-
"Mark all tasks with status 'Done' as archived"
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### Data Export
|
|
353
|
-
```
|
|
354
|
-
"Export the entire Customers table as a CSV file"
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
## Benefits
|
|
358
|
-
|
|
359
|
-
1. **Complete Functionality**: Full CRUD operations matching Airtable's capabilities
|
|
360
|
-
2. **Natural Language**: All operations accessible through conversational AI
|
|
361
|
-
3. **Productivity**: Batch operations and data import/export save time
|
|
362
|
-
4. **Flexibility**: Support for complex queries and relationships
|
|
363
|
-
5. **Enterprise Ready**: Schema management and analytics features
|
|
364
|
-
|
|
365
|
-
## Next Steps
|
|
366
|
-
|
|
367
|
-
1. Prioritize features based on user needs
|
|
368
|
-
2. Implement Phase 1 features (essential CRUD)
|
|
369
|
-
3. Add comprehensive testing for each new tool
|
|
370
|
-
4. Update documentation with examples
|
|
371
|
-
5. Gather user feedback for Phase 2 planning
|
package/INSTALLATION.md
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# Installation
|
|
2
|
-
|
|
3
|
-
Airtable MCP embeds Airtable database connectivity directly into your AI-powered code editor
|
|
4
|
-
|
|
5
|
-
## Getting Started
|
|
6
|
-
|
|
7
|
-
Built by Rashid Azarang,
|
|
8
|
-
|
|
9
|
-
Airtable MCP gives AI code editors and agents the ability to access and manipulate your Airtable databases for powerful data management capabilities - all in a secure manner with your own API tokens.
|
|
10
|
-
|
|
11
|
-
With this MCP server tool, you can enable AI code editors and agents to have access to:
|
|
12
|
-
|
|
13
|
-
* List and access all your Airtable bases
|
|
14
|
-
* Browse tables, fields, and record data
|
|
15
|
-
* Create, read, update, and delete records
|
|
16
|
-
* Export and manipulate schemas
|
|
17
|
-
* Perform complex queries against your data
|
|
18
|
-
* Create data migration mappings
|
|
19
|
-
* Analyze and transform your Airtable data
|
|
20
|
-
|
|
21
|
-
That way, you can simply tell Cursor or any AI code editor with MCP integrations:
|
|
22
|
-
|
|
23
|
-
"Show me all the tables in my Airtable base"
|
|
24
|
-
|
|
25
|
-
"Find all records from the Customers table where the status is Active and the last purchase was after January 1st"
|
|
26
|
-
|
|
27
|
-
"Create a new record in the Products table with these fields..."
|
|
28
|
-
|
|
29
|
-
"Export the schema of my current Airtable base"
|
|
30
|
-
|
|
31
|
-
"Help me create a mapping between these two tables for data migration"
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Requirements
|
|
36
|
-
|
|
37
|
-
* Node.js 14+ installed on your machine
|
|
38
|
-
* Python 3.10+ installed on your machine (automatically detected)
|
|
39
|
-
* Airtable Personal Access Token (API Key)
|
|
40
|
-
* MCP Client Application (Cursor, Claude Desktop, Cline, Zed, etc.)
|
|
41
|
-
|
|
42
|
-
**Note**: Model Context Protocol (MCP) is specific to Anthropic models. When using an editor like Cursor, make sure to enable composer agent with Claude 3.5 Sonnet selected as the model.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Installation
|
|
47
|
-
|
|
48
|
-
### 1. Install via Smithery (Easiest)
|
|
49
|
-
|
|
50
|
-
The easiest way to install Airtable MCP is through Smithery:
|
|
51
|
-
|
|
52
|
-
1. Visit [Smithery](https://smithery.ai)
|
|
53
|
-
2. Search for "@rashidazarang/airtable-mcp"
|
|
54
|
-
3. Click "Install" and follow the prompts to configure with your Airtable token and base ID
|
|
55
|
-
|
|
56
|
-
### 2. Install via NPX (Alternative)
|
|
57
|
-
|
|
58
|
-
Another simple way to install and use Airtable MCP is via NPX:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
# Install globally
|
|
62
|
-
npm install -g airtable-mcp
|
|
63
|
-
|
|
64
|
-
# Or use directly with npx (no installation needed)
|
|
65
|
-
npx airtable-mcp --token YOUR_AIRTABLE_TOKEN --base YOUR_BASE_ID
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 3. Get Your Airtable API Token
|
|
69
|
-
|
|
70
|
-
1. Log in to your Airtable account
|
|
71
|
-
2. Go to your [Account Settings](https://airtable.com/account)
|
|
72
|
-
3. Navigate to the "API" section
|
|
73
|
-
4. Create a Personal Access Token with appropriate permissions
|
|
74
|
-
5. Copy your token to use in the configuration
|
|
75
|
-
|
|
76
|
-
### 4. Configure Your MCP Client
|
|
77
|
-
|
|
78
|
-
#### For Cursor:
|
|
79
|
-
|
|
80
|
-
1. Go to Cursor Settings
|
|
81
|
-
2. Navigate to Features, scroll down to MCP Servers and click "Add new MCP server"
|
|
82
|
-
3. Give it a unique name (airtable-tools), set type to "command" and set the command to:
|
|
83
|
-
|
|
84
|
-
**For macOS/Linux/Windows:**
|
|
85
|
-
```bash
|
|
86
|
-
npx airtable-mcp --token YOUR_AIRTABLE_TOKEN --base YOUR_BASE_ID
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Replace `YOUR_AIRTABLE_TOKEN` with your Airtable Personal Access Token and `YOUR_BASE_ID` with your default Airtable base ID (optional).
|
|
90
|
-
|
|
91
|
-
#### For Advanced Users via ~/.cursor/mcp.json:
|
|
92
|
-
|
|
93
|
-
Edit your `~/.cursor/mcp.json` file to include:
|
|
94
|
-
|
|
95
|
-
```json
|
|
96
|
-
{
|
|
97
|
-
"mcpServers": {
|
|
98
|
-
"airtable-tools": {
|
|
99
|
-
"command": "npx",
|
|
100
|
-
"args": [
|
|
101
|
-
"airtable-mcp",
|
|
102
|
-
"--token", "YOUR_AIRTABLE_TOKEN",
|
|
103
|
-
"--base", "YOUR_BASE_ID"
|
|
104
|
-
]
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 5. Verify Connection
|
|
111
|
-
|
|
112
|
-
1. Restart your MCP client (Cursor, etc.)
|
|
113
|
-
2. Create a new query using the Composer Agent with Claude 3.5 Sonnet model
|
|
114
|
-
3. Ask something like "List my Airtable bases" or "Show me the tables in my current base"
|
|
115
|
-
4. You should see a response with your Airtable data
|
|
116
|
-
|
|
117
|
-
### 6. For Production Use (Optional)
|
|
118
|
-
|
|
119
|
-
For continuous availability, you can set up Airtable MCP using PM2:
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
# Install PM2 if you don't have it
|
|
123
|
-
npm install -g pm2
|
|
124
|
-
|
|
125
|
-
# Create a PM2 config file
|
|
126
|
-
echo 'module.exports = {
|
|
127
|
-
apps: [
|
|
128
|
-
{
|
|
129
|
-
name: "airtable-mcp",
|
|
130
|
-
script: "npx",
|
|
131
|
-
args: [
|
|
132
|
-
"airtable-mcp",
|
|
133
|
-
"--token", "YOUR_AIRTABLE_TOKEN",
|
|
134
|
-
"--base", "YOUR_BASE_ID"
|
|
135
|
-
],
|
|
136
|
-
env: {
|
|
137
|
-
PATH: process.env.PATH,
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
};' > ecosystem.config.js
|
|
142
|
-
|
|
143
|
-
# Start the process
|
|
144
|
-
pm2 start ecosystem.config.js
|
|
145
|
-
|
|
146
|
-
# Set it to start on boot
|
|
147
|
-
pm2 startup
|
|
148
|
-
pm2 save
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Troubleshooting
|
|
154
|
-
|
|
155
|
-
Here are some common issues and their solutions:
|
|
156
|
-
|
|
157
|
-
### Error: Unable to connect to Airtable API
|
|
158
|
-
|
|
159
|
-
- Double-check your Airtable API token is correct and has sufficient permissions
|
|
160
|
-
- Verify your internet connection
|
|
161
|
-
- Check if Airtable API is experiencing downtime
|
|
162
|
-
|
|
163
|
-
### Issue: MCP server not connecting
|
|
164
|
-
|
|
165
|
-
- Make sure Node.js 14+ and Python 3.10+ are installed and in your PATH
|
|
166
|
-
- Try specifying a specific version: `npx airtable-mcp@latest`
|
|
167
|
-
- Check the Cursor logs for any connection errors
|
|
168
|
-
|
|
169
|
-
### Error: Base not found
|
|
170
|
-
|
|
171
|
-
- Verify your base ID is correct
|
|
172
|
-
- Make sure your API token has access to the specified base
|
|
173
|
-
- Try listing all bases first to confirm access
|
|
174
|
-
|
|
175
|
-
### Issue: Permission denied errors
|
|
176
|
-
|
|
177
|
-
- Make sure your token has the necessary permissions for the operations you're trying to perform
|
|
178
|
-
- Check if you're attempting operations on tables/bases that your token doesn't have access to
|
|
179
|
-
|
|
180
|
-
### For more help
|
|
181
|
-
|
|
182
|
-
- Open an issue on the [GitHub repository](https://github.com/rashidazarang/airtable-mcp/issues)
|
|
183
|
-
- Check the Airtable API documentation for any API-specific errors
|
package/ISSUE_RESPONSES.md
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# GitHub Issue Responses
|
|
2
|
-
|
|
3
|
-
## Issue #7: Personal Access Token Leakage
|
|
4
|
-
|
|
5
|
-
Thank you for responsibly disclosing this security vulnerability. This has been fixed in v1.2.4.
|
|
6
|
-
|
|
7
|
-
### Actions Taken:
|
|
8
|
-
✅ Removed all hardcoded tokens from test files
|
|
9
|
-
✅ Updated code to require environment variables for credentials
|
|
10
|
-
✅ Added SECURITY_NOTICE.md with rotation instructions
|
|
11
|
-
✅ The exposed tokens have been invalidated
|
|
12
|
-
|
|
13
|
-
### Changes Made:
|
|
14
|
-
- `test_client.py` - Now uses environment variables
|
|
15
|
-
- `test_mcp_comprehensive.js` - Now uses environment variables
|
|
16
|
-
- Added `.env.example` file for secure configuration
|
|
17
|
-
- Updated documentation with security best practices
|
|
18
|
-
|
|
19
|
-
All users should update to v1.2.4 immediately. The exposed tokens are no longer valid, and users must use their own Airtable credentials.
|
|
20
|
-
|
|
21
|
-
Thank you for helping improve the security of this project!
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Issue #6: [Server Bug] @rashidazarang/airtable-mcp
|
|
26
|
-
|
|
27
|
-
This issue has been resolved in v1.2.4!
|
|
28
|
-
|
|
29
|
-
### Root Cause:
|
|
30
|
-
The Smithery configuration was using the Python implementation which had compatibility issues with MCP 1.4.1.
|
|
31
|
-
|
|
32
|
-
### Solution:
|
|
33
|
-
- Updated `smithery.yaml` to use the stable JavaScript implementation (`airtable_simple.js`)
|
|
34
|
-
- Fixed authentication flow to properly handle credentials
|
|
35
|
-
- Added proper environment variable support
|
|
36
|
-
|
|
37
|
-
### To fix:
|
|
38
|
-
1. Update to v1.2.4: `npm install @rashidazarang/airtable-mcp@latest`
|
|
39
|
-
2. Reconfigure with your credentials as shown in the updated README
|
|
40
|
-
3. Restart Claude Desktop
|
|
41
|
-
|
|
42
|
-
The server should now connect properly without the "API key is required" error.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Issue #5: When Using Smithy, throwing 'Streamable HTTP error: Error POSTing to endpoint (HTTP 400): null'
|
|
47
|
-
|
|
48
|
-
Fixed in v1.2.4! This was the same root cause as Issue #6.
|
|
49
|
-
|
|
50
|
-
### What was wrong:
|
|
51
|
-
- The Python server had MCP compatibility issues
|
|
52
|
-
- Authentication wasn't being handled correctly
|
|
53
|
-
- The Smithery configuration was misconfigured
|
|
54
|
-
|
|
55
|
-
### What we fixed:
|
|
56
|
-
- Switched to the JavaScript implementation
|
|
57
|
-
- Updated smithery.yaml with proper configuration
|
|
58
|
-
- Fixed credential passing through Smithery
|
|
59
|
-
|
|
60
|
-
### How to resolve:
|
|
61
|
-
```bash
|
|
62
|
-
# Update to latest version
|
|
63
|
-
npm install -g @rashidazarang/airtable-mcp@latest
|
|
64
|
-
|
|
65
|
-
# Or if using Smithery directly:
|
|
66
|
-
npx @smithery/cli install @rashidazarang/airtable-mcp --update
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Then reconfigure with your Airtable credentials. The HTTP 400 errors should be resolved.
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Issue #4: Glama listing is missing Dockerfile
|
|
74
|
-
|
|
75
|
-
Fixed in v1.2.4!
|
|
76
|
-
|
|
77
|
-
### Changes:
|
|
78
|
-
- Created `Dockerfile.node` specifically for Node.js deployment
|
|
79
|
-
- Updated `smithery.yaml` to reference the correct Dockerfile
|
|
80
|
-
- The original Dockerfile is retained for backward compatibility
|
|
81
|
-
|
|
82
|
-
The Dockerfile is now included and properly configured for cloud deployments.
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
# GitHub Release Text for v1.2.4
|
|
87
|
-
|
|
88
|
-
## 🚨 Critical Security Release - v1.2.4
|
|
89
|
-
|
|
90
|
-
### ⚠️ IMPORTANT SECURITY FIX
|
|
91
|
-
|
|
92
|
-
This release addresses a **critical security vulnerability** where API tokens were hardcoded in test files. All users should update immediately.
|
|
93
|
-
|
|
94
|
-
### 🔒 Security Fixes
|
|
95
|
-
- **Removed hardcoded API tokens** from all test files (fixes #7)
|
|
96
|
-
- Test files now require environment variables for credentials
|
|
97
|
-
- Added comprehensive security documentation
|
|
98
|
-
- Previously exposed tokens have been invalidated
|
|
99
|
-
|
|
100
|
-
### 🐛 Bug Fixes
|
|
101
|
-
- **Fixed Smithery deployment issues** (fixes #5, #6)
|
|
102
|
-
- Resolved HTTP 400 errors when connecting through Smithery
|
|
103
|
-
- Fixed "API key is required for remote connections" error
|
|
104
|
-
- Switched to stable JavaScript implementation for cloud deployments
|
|
105
|
-
- **Added missing Dockerfile** for Glama listing (fixes #4)
|
|
106
|
-
|
|
107
|
-
### ✨ Improvements
|
|
108
|
-
- Added environment variable support for secure credential management
|
|
109
|
-
- Improved logging with configurable levels (ERROR, WARN, INFO, DEBUG)
|
|
110
|
-
- Enhanced error messages for better debugging
|
|
111
|
-
- Updated documentation with clear setup instructions
|
|
112
|
-
|
|
113
|
-
### 📦 What's Changed
|
|
114
|
-
- `test_client.py` - Now uses environment variables
|
|
115
|
-
- `test_mcp_comprehensive.js` - Now uses environment variables
|
|
116
|
-
- `airtable_simple.js` - Added env variable and logging support
|
|
117
|
-
- `smithery.yaml` - Fixed to use JavaScript implementation
|
|
118
|
-
- `Dockerfile.node` - New optimized Docker image for Node.js
|
|
119
|
-
- `SECURITY_NOTICE.md` - Important security information
|
|
120
|
-
- `README.md` - Complete rewrite with better instructions
|
|
121
|
-
|
|
122
|
-
### 💔 Breaking Changes
|
|
123
|
-
Test files now require environment variables:
|
|
124
|
-
```bash
|
|
125
|
-
export AIRTABLE_TOKEN="your_token"
|
|
126
|
-
export AIRTABLE_BASE_ID="your_base_id"
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 📋 Migration Instructions
|
|
130
|
-
|
|
131
|
-
1. **Update to v1.2.4:**
|
|
132
|
-
```bash
|
|
133
|
-
npm install -g @rashidazarang/airtable-mcp@latest
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
2. **Set up environment variables:**
|
|
137
|
-
```bash
|
|
138
|
-
export AIRTABLE_TOKEN="your_personal_token"
|
|
139
|
-
export AIRTABLE_BASE_ID="your_base_id"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
3. **Update your MCP configuration** (see README for details)
|
|
143
|
-
|
|
144
|
-
4. **Restart your MCP client**
|
|
145
|
-
|
|
146
|
-
### 🙏 Acknowledgments
|
|
147
|
-
Special thanks to @BXXC-SDXZ for responsibly disclosing the security vulnerability, and to @ricklesgibson and @punkpeye for reporting the deployment issues.
|
|
148
|
-
|
|
149
|
-
### ⚠️ Security Note
|
|
150
|
-
If you were using the previously exposed tokens, they have been revoked. You must use your own Airtable credentials going forward.
|
|
151
|
-
|
|
152
|
-
**Full Changelog**: https://github.com/rashidazarang/airtable-mcp/compare/v1.2.3...v1.2.4
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## NPM Publish Commands
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
# Make sure you're logged in to npm
|
|
160
|
-
npm login
|
|
161
|
-
|
|
162
|
-
# Update version (already done in package.json)
|
|
163
|
-
npm version 1.2.4
|
|
164
|
-
|
|
165
|
-
# Publish to npm
|
|
166
|
-
npm publish --access public
|
|
167
|
-
|
|
168
|
-
# Create git tag
|
|
169
|
-
git tag -a v1.2.4 -m "Critical security fix and Smithery deployment fixes"
|
|
170
|
-
git push origin v1.2.4
|
|
171
|
-
```
|