@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.
Files changed (57) hide show
  1. package/README.md +1 -0
  2. package/airtable_simple_production.js +532 -0
  3. package/package.json +15 -6
  4. package/.claude/settings.local.json +0 -12
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  6. package/.github/ISSUE_TEMPLATE/custom.md +0 -10
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  8. package/CAPABILITY_REPORT.md +0 -118
  9. package/CLAUDE_INTEGRATION.md +0 -96
  10. package/CONTRIBUTING.md +0 -81
  11. package/DEVELOPMENT.md +0 -190
  12. package/Dockerfile +0 -39
  13. package/Dockerfile.node +0 -20
  14. package/IMPROVEMENT_PROPOSAL.md +0 -371
  15. package/INSTALLATION.md +0 -183
  16. package/ISSUE_RESPONSES.md +0 -171
  17. package/MCP_REVIEW_SUMMARY.md +0 -142
  18. package/QUICK_START.md +0 -60
  19. package/RELEASE_NOTES_v1.2.0.md +0 -50
  20. package/RELEASE_NOTES_v1.2.1.md +0 -40
  21. package/RELEASE_NOTES_v1.2.2.md +0 -48
  22. package/RELEASE_NOTES_v1.2.3.md +0 -105
  23. package/RELEASE_NOTES_v1.2.4.md +0 -60
  24. package/RELEASE_NOTES_v1.4.0.md +0 -104
  25. package/RELEASE_NOTES_v1.5.0.md +0 -185
  26. package/RELEASE_NOTES_v1.6.0.md +0 -248
  27. package/SECURITY_NOTICE.md +0 -40
  28. package/airtable-mcp-1.1.0.tgz +0 -0
  29. package/airtable_enhanced.js +0 -499
  30. package/airtable_mcp/__init__.py +0 -5
  31. package/airtable_mcp/src/server.py +0 -329
  32. package/airtable_simple_v1.2.4_backup.js +0 -277
  33. package/airtable_v1.4.0.js +0 -654
  34. package/cleanup.sh +0 -71
  35. package/index.js +0 -179
  36. package/inspector.py +0 -148
  37. package/inspector_server.py +0 -337
  38. package/publish-steps.txt +0 -27
  39. package/quick_test.sh +0 -30
  40. package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
  41. package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
  42. package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
  43. package/requirements.txt +0 -10
  44. package/setup.py +0 -29
  45. package/simple_airtable_server.py +0 -151
  46. package/smithery.yaml +0 -45
  47. package/test_all_features.sh +0 -146
  48. package/test_all_operations.sh +0 -120
  49. package/test_client.py +0 -70
  50. package/test_enhanced_features.js +0 -389
  51. package/test_mcp_comprehensive.js +0 -163
  52. package/test_mock_server.js +0 -180
  53. package/test_v1.4.0_final.sh +0 -131
  54. package/test_v1.5.0_comprehensive.sh +0 -96
  55. package/test_v1.5.0_final.sh +0 -224
  56. package/test_v1.6.0_comprehensive.sh +0 -187
  57. package/test_webhooks.sh +0 -105
@@ -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
@@ -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
- ```