@rashidazarang/airtable-mcp 2.1.0 → 2.2.0

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.
Files changed (155) hide show
  1. package/README.md +1 -1
  2. package/airtable_simple_production.js +387 -5
  3. package/examples/claude_simple_config.json +0 -9
  4. package/package.json +10 -1
  5. package/.github/ISSUE_TEMPLATE/bug-report.yml +0 -173
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  7. package/.github/ISSUE_TEMPLATE/custom.md +0 -10
  8. package/.github/ISSUE_TEMPLATE/feature-request.yml +0 -209
  9. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  10. package/.github/ISSUE_TEMPLATE/security-report.yml +0 -216
  11. package/.github/pull_request_template.md +0 -245
  12. package/.github/workflows/ci-cd.yml +0 -408
  13. package/.github/workflows/security-audit.yml +0 -316
  14. package/API_DOCUMENTATION.md +0 -897
  15. package/CAPABILITY_REPORT.md +0 -118
  16. package/CLAUDE_INTEGRATION.md +0 -96
  17. package/CODE_OF_CONDUCT.md +0 -181
  18. package/CONTRIBUTING.md +0 -81
  19. package/DEVELOPMENT.md +0 -190
  20. package/Dockerfile +0 -39
  21. package/Dockerfile.node +0 -20
  22. package/Dockerfile.production +0 -127
  23. package/IMPROVEMENT_PROPOSAL.md +0 -371
  24. package/INSTALLATION.md +0 -183
  25. package/ISSUE_RESPONSES.md +0 -171
  26. package/MCP_REVIEW_SUMMARY.md +0 -142
  27. package/QUICK_START.md +0 -60
  28. package/RELEASE_NOTES_v1.2.0.md +0 -50
  29. package/RELEASE_NOTES_v1.2.1.md +0 -40
  30. package/RELEASE_NOTES_v1.2.2.md +0 -48
  31. package/RELEASE_NOTES_v1.2.3.md +0 -105
  32. package/RELEASE_NOTES_v1.2.4.md +0 -60
  33. package/RELEASE_NOTES_v1.4.0.md +0 -104
  34. package/RELEASE_NOTES_v1.5.0.md +0 -185
  35. package/RELEASE_NOTES_v1.6.0.md +0 -248
  36. package/SECURITY_NOTICE.md +0 -40
  37. package/airtable-clipper/CHANGELOG.md +0 -198
  38. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +0 -343
  39. package/airtable-clipper/LAUNCH_STRATEGY.md +0 -495
  40. package/airtable-clipper/LICENSE +0 -21
  41. package/airtable-clipper/OAUTH_SETUP.md +0 -51
  42. package/airtable-clipper/PRIVACY_POLICY.md +0 -187
  43. package/airtable-clipper/README.md +0 -575
  44. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +0 -273
  45. package/airtable-clipper/build.sh +0 -85
  46. package/airtable-clipper/docs/QUICK_START.md +0 -99
  47. package/airtable-clipper/docs/SETUP.md +0 -291
  48. package/airtable-clipper/extension/background.js +0 -337
  49. package/airtable-clipper/extension/base-setup.html +0 -324
  50. package/airtable-clipper/extension/base-setup.js +0 -471
  51. package/airtable-clipper/extension/content.js +0 -771
  52. package/airtable-clipper/extension/icons/README.md +0 -69
  53. package/airtable-clipper/extension/icons/icon-16.png +0 -3
  54. package/airtable-clipper/extension/manifest.json +0 -73
  55. package/airtable-clipper/extension/popup.html +0 -144
  56. package/airtable-clipper/extension/popup.js +0 -475
  57. package/airtable-clipper/extension/styles/content.css +0 -229
  58. package/airtable-clipper/extension/styles/popup.css +0 -477
  59. package/airtable-clipper/privacy-policy.md +0 -63
  60. package/airtable-clipper/releases/v1.0.0/background.js +0 -337
  61. package/airtable-clipper/releases/v1.0.0/base-setup.html +0 -324
  62. package/airtable-clipper/releases/v1.0.0/base-setup.js +0 -471
  63. package/airtable-clipper/releases/v1.0.0/content.js +0 -771
  64. package/airtable-clipper/releases/v1.0.0/icons/README.md +0 -69
  65. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +0 -2
  66. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +0 -3
  67. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +0 -2
  68. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +0 -2
  69. package/airtable-clipper/releases/v1.0.0/manifest.json +0 -73
  70. package/airtable-clipper/releases/v1.0.0/popup.html +0 -144
  71. package/airtable-clipper/releases/v1.0.0/popup.js +0 -475
  72. package/airtable-clipper/releases/v1.0.0/sidepanel.html +0 -25
  73. package/airtable-clipper/releases/v1.0.0/styles/content.css +0 -229
  74. package/airtable-clipper/releases/v1.0.0/styles/popup.css +0 -477
  75. package/airtable-clipper/releases/v1.0.1/background.js +0 -337
  76. package/airtable-clipper/releases/v1.0.1/base-setup.html +0 -324
  77. package/airtable-clipper/releases/v1.0.1/base-setup.js +0 -471
  78. package/airtable-clipper/releases/v1.0.1/content.js +0 -771
  79. package/airtable-clipper/releases/v1.0.1/icons/README.md +0 -69
  80. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +0 -2
  81. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +0 -3
  82. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +0 -2
  83. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +0 -2
  84. package/airtable-clipper/releases/v1.0.1/manifest.json +0 -70
  85. package/airtable-clipper/releases/v1.0.1/popup.html +0 -157
  86. package/airtable-clipper/releases/v1.0.1/popup.js +0 -562
  87. package/airtable-clipper/releases/v1.0.1/sidepanel.html +0 -25
  88. package/airtable-clipper/releases/v1.0.1/styles/content.css +0 -229
  89. package/airtable-clipper/releases/v1.0.1/styles/popup.css +0 -647
  90. package/airtable-clipper/releases/v1.0.2/background.js +0 -337
  91. package/airtable-clipper/releases/v1.0.2/base-setup.html +0 -324
  92. package/airtable-clipper/releases/v1.0.2/base-setup.js +0 -471
  93. package/airtable-clipper/releases/v1.0.2/content.js +0 -771
  94. package/airtable-clipper/releases/v1.0.2/icons/README.md +0 -69
  95. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +0 -2
  96. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +0 -3
  97. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +0 -2
  98. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +0 -2
  99. package/airtable-clipper/releases/v1.0.2/manifest.json +0 -62
  100. package/airtable-clipper/releases/v1.0.2/popup.html +0 -157
  101. package/airtable-clipper/releases/v1.0.2/popup.js +0 -567
  102. package/airtable-clipper/releases/v1.0.2/sidepanel.html +0 -25
  103. package/airtable-clipper/releases/v1.0.2/styles/content.css +0 -229
  104. package/airtable-clipper/releases/v1.0.2/styles/popup.css +0 -647
  105. package/airtable-clipper/terms-of-service.md +0 -124
  106. package/airtable-clipper/test-credentials.md +0 -61
  107. package/airtable-clipper/test-extension/background.js +0 -337
  108. package/airtable-clipper/test-extension/base-setup.html +0 -324
  109. package/airtable-clipper/test-extension/base-setup.js +0 -471
  110. package/airtable-clipper/test-extension/content.js +0 -873
  111. package/airtable-clipper/test-extension/icons/README.md +0 -69
  112. package/airtable-clipper/test-extension/icons/icon-128.png +0 -2
  113. package/airtable-clipper/test-extension/icons/icon-16.png +0 -3
  114. package/airtable-clipper/test-extension/icons/icon-32.png +0 -2
  115. package/airtable-clipper/test-extension/icons/icon-48.png +0 -2
  116. package/airtable-clipper/test-extension/manifest.json +0 -72
  117. package/airtable-clipper/test-extension/popup.html +0 -274
  118. package/airtable-clipper/test-extension/popup.js +0 -729
  119. package/airtable-clipper/test-extension/sidepanel.html +0 -25
  120. package/airtable-clipper/test-extension/styles/content.css +0 -229
  121. package/airtable-clipper/test-extension/styles/popup.css +0 -794
  122. package/airtable_mcp/__init__.py +0 -5
  123. package/airtable_mcp/src/server.py +0 -329
  124. package/airtable_mcp_v2.js +0 -1505
  125. package/airtable_mcp_v2_oauth.js +0 -1048
  126. package/airtable_mcp_v3_advanced.js +0 -1161
  127. package/cleanup.sh +0 -71
  128. package/docker-compose.production.yml +0 -366
  129. package/helm/airtable-mcp/Chart.yaml +0 -122
  130. package/helm/airtable-mcp/values.yaml +0 -538
  131. package/index.js +0 -179
  132. package/inspector.py +0 -148
  133. package/inspector_server.py +0 -337
  134. package/k8s/deployment.yaml +0 -402
  135. package/k8s/namespace.yaml +0 -108
  136. package/k8s/service.yaml +0 -194
  137. package/monitoring/alerts.yml +0 -289
  138. package/monitoring/prometheus.yml +0 -224
  139. package/publish-steps.txt +0 -27
  140. package/quick_test.sh +0 -30
  141. package/requirements.txt +0 -10
  142. package/setup.py +0 -29
  143. package/simple_airtable_server.py +0 -151
  144. package/smithery.yaml +0 -45
  145. package/test_all_features.sh +0 -146
  146. package/test_all_operations.sh +0 -120
  147. package/test_client.py +0 -70
  148. package/test_enhanced_features.js +0 -389
  149. package/test_mcp_comprehensive.js +0 -163
  150. package/test_mock_server.js +0 -180
  151. package/test_v1.4.0_final.sh +0 -131
  152. package/test_v1.5.0_comprehensive.sh +0 -96
  153. package/test_v1.5.0_final.sh +0 -224
  154. package/test_v1.6.0_comprehensive.sh +0 -187
  155. package/test_webhooks.sh +0 -105
package/Dockerfile.node DELETED
@@ -1,20 +0,0 @@
1
- FROM node:18-slim
2
-
3
- WORKDIR /app
4
-
5
- # Copy package files
6
- COPY package*.json ./
7
-
8
- # Install dependencies
9
- RUN npm ci --only=production
10
-
11
- # Copy the main application files
12
- COPY airtable_simple.js ./
13
- COPY .env.example ./
14
-
15
- # Create a non-root user
16
- RUN useradd -m -u 1000 mcpuser && chown -R mcpuser:mcpuser /app
17
- USER mcpuser
18
-
19
- # The server will be started with command line arguments by Smithery
20
- ENTRYPOINT ["node", "airtable_simple.js"]
@@ -1,127 +0,0 @@
1
- # Multi-stage Production Dockerfile for Airtable MCP Server
2
- # Optimized for security, performance, and minimal attack surface
3
- # Trust Score: 100/100 target
4
-
5
- # ============================================================================
6
- # BUILD STAGE - Dependencies and compilation
7
- # ============================================================================
8
- FROM node:18-alpine AS builder
9
-
10
- # Security: Create non-root user early
11
- RUN addgroup -g 1001 -S nodejs && \
12
- adduser -S mcp -u 1001
13
-
14
- # Set working directory
15
- WORKDIR /app
16
-
17
- # Copy package files for dependency installation
18
- COPY package*.json ./
19
- COPY .npmrc* ./
20
-
21
- # Install dependencies with security optimizations
22
- RUN npm ci --only=production --ignore-scripts && \
23
- npm cache clean --force && \
24
- # Remove npm to reduce attack surface
25
- rm -rf /usr/local/lib/node_modules/npm
26
-
27
- # Copy application source
28
- COPY --chown=mcp:nodejs . .
29
-
30
- # Remove development files and sensitive data
31
- RUN rm -rf \
32
- .git \
33
- .github \
34
- tests \
35
- *.test.js \
36
- *.spec.js \
37
- .env.example \
38
- .env.* \
39
- docs \
40
- examples/python* \
41
- *.md \
42
- .eslintrc* \
43
- .prettier* \
44
- jest.config* \
45
- coverage
46
-
47
- # ============================================================================
48
- # RUNTIME STAGE - Minimal production image
49
- # ============================================================================
50
- FROM node:18-alpine AS production
51
-
52
- # Security labels and metadata
53
- LABEL maintainer="Rashid Azarang <rashid@example.com>" \
54
- description="Enhanced Airtable MCP Server v2.1 - Production Ready" \
55
- version="2.1.0" \
56
- security.scan="enabled" \
57
- trust.score="100" \
58
- org.opencontainers.image.title="Airtable MCP Server" \
59
- org.opencontainers.image.description="Production-ready MCP server with OAuth2 and enterprise security" \
60
- org.opencontainers.image.version="2.1.0" \
61
- org.opencontainers.image.vendor="Rashid Azarang" \
62
- org.opencontainers.image.licenses="MIT" \
63
- org.opencontainers.image.source="https://github.com/rashidazarang/airtable-mcp"
64
-
65
- # Install security updates and minimal runtime dependencies
66
- RUN apk update && \
67
- apk upgrade && \
68
- apk add --no-cache \
69
- ca-certificates \
70
- curl \
71
- dumb-init \
72
- tzdata && \
73
- # Clean up
74
- rm -rf /var/cache/apk/* /tmp/*
75
-
76
- # Create non-root user and group
77
- RUN addgroup -g 1001 -S nodejs && \
78
- adduser -S mcp -u 1001 -G nodejs
79
-
80
- # Set working directory
81
- WORKDIR /app
82
-
83
- # Copy built application from builder stage
84
- COPY --from=builder --chown=mcp:nodejs /app/node_modules ./node_modules
85
- COPY --from=builder --chown=mcp:nodejs /app/package*.json ./
86
- COPY --from=builder --chown=mcp:nodejs /app/*.js ./
87
-
88
- # Create necessary directories with proper permissions
89
- RUN mkdir -p /app/logs /app/tmp && \
90
- chown -R mcp:nodejs /app && \
91
- chmod -R 750 /app && \
92
- chmod -R 755 /app/logs /app/tmp
93
-
94
- # Security: Remove shell access and package managers
95
- RUN rm -rf /bin/sh /usr/bin/wget /usr/bin/curl || true
96
-
97
- # Switch to non-root user
98
- USER mcp:nodejs
99
-
100
- # Health check
101
- HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
102
- CMD node -e "require('http').get('http://localhost:8010/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"
103
-
104
- # Environment variables with secure defaults
105
- ENV NODE_ENV=production \
106
- PORT=8010 \
107
- HOST=0.0.0.0 \
108
- LOG_LEVEL=INFO \
109
- LOG_FORMAT=json \
110
- CACHE_TTL=60 \
111
- MAX_REQUESTS_PER_MINUTE=60 \
112
- CONNECTION_TIMEOUT=30000 \
113
- REQUEST_TIMEOUT=10000
114
-
115
- # Expose port
116
- EXPOSE 8010
117
-
118
- # Use dumb-init for proper signal handling
119
- ENTRYPOINT ["/usr/bin/dumb-init", "--"]
120
-
121
- # Start the application
122
- CMD ["node", "airtable_mcp_v2_oauth.js"]
123
-
124
- # Security: Set read-only filesystem (uncomment for maximum security)
125
- # Note: May require volume mounts for logs and tmp directories
126
- # RUN chmod -R a-w /app
127
- # VOLUME ["/app/logs", "/app/tmp"]
@@ -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