@rashidazarang/airtable-mcp 2.1.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 (152) hide show
  1. package/package.json +10 -1
  2. package/.github/ISSUE_TEMPLATE/bug-report.yml +0 -173
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  4. package/.github/ISSUE_TEMPLATE/custom.md +0 -10
  5. package/.github/ISSUE_TEMPLATE/feature-request.yml +0 -209
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  7. package/.github/ISSUE_TEMPLATE/security-report.yml +0 -216
  8. package/.github/pull_request_template.md +0 -245
  9. package/.github/workflows/ci-cd.yml +0 -408
  10. package/.github/workflows/security-audit.yml +0 -316
  11. package/API_DOCUMENTATION.md +0 -897
  12. package/CAPABILITY_REPORT.md +0 -118
  13. package/CLAUDE_INTEGRATION.md +0 -96
  14. package/CODE_OF_CONDUCT.md +0 -181
  15. package/CONTRIBUTING.md +0 -81
  16. package/DEVELOPMENT.md +0 -190
  17. package/Dockerfile +0 -39
  18. package/Dockerfile.node +0 -20
  19. package/Dockerfile.production +0 -127
  20. package/IMPROVEMENT_PROPOSAL.md +0 -371
  21. package/INSTALLATION.md +0 -183
  22. package/ISSUE_RESPONSES.md +0 -171
  23. package/MCP_REVIEW_SUMMARY.md +0 -142
  24. package/QUICK_START.md +0 -60
  25. package/RELEASE_NOTES_v1.2.0.md +0 -50
  26. package/RELEASE_NOTES_v1.2.1.md +0 -40
  27. package/RELEASE_NOTES_v1.2.2.md +0 -48
  28. package/RELEASE_NOTES_v1.2.3.md +0 -105
  29. package/RELEASE_NOTES_v1.2.4.md +0 -60
  30. package/RELEASE_NOTES_v1.4.0.md +0 -104
  31. package/RELEASE_NOTES_v1.5.0.md +0 -185
  32. package/RELEASE_NOTES_v1.6.0.md +0 -248
  33. package/SECURITY_NOTICE.md +0 -40
  34. package/airtable-clipper/CHANGELOG.md +0 -198
  35. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +0 -343
  36. package/airtable-clipper/LAUNCH_STRATEGY.md +0 -495
  37. package/airtable-clipper/LICENSE +0 -21
  38. package/airtable-clipper/OAUTH_SETUP.md +0 -51
  39. package/airtable-clipper/PRIVACY_POLICY.md +0 -187
  40. package/airtable-clipper/README.md +0 -575
  41. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +0 -273
  42. package/airtable-clipper/build.sh +0 -85
  43. package/airtable-clipper/docs/QUICK_START.md +0 -99
  44. package/airtable-clipper/docs/SETUP.md +0 -291
  45. package/airtable-clipper/extension/background.js +0 -337
  46. package/airtable-clipper/extension/base-setup.html +0 -324
  47. package/airtable-clipper/extension/base-setup.js +0 -471
  48. package/airtable-clipper/extension/content.js +0 -771
  49. package/airtable-clipper/extension/icons/README.md +0 -69
  50. package/airtable-clipper/extension/icons/icon-16.png +0 -3
  51. package/airtable-clipper/extension/manifest.json +0 -73
  52. package/airtable-clipper/extension/popup.html +0 -144
  53. package/airtable-clipper/extension/popup.js +0 -475
  54. package/airtable-clipper/extension/styles/content.css +0 -229
  55. package/airtable-clipper/extension/styles/popup.css +0 -477
  56. package/airtable-clipper/privacy-policy.md +0 -63
  57. package/airtable-clipper/releases/v1.0.0/background.js +0 -337
  58. package/airtable-clipper/releases/v1.0.0/base-setup.html +0 -324
  59. package/airtable-clipper/releases/v1.0.0/base-setup.js +0 -471
  60. package/airtable-clipper/releases/v1.0.0/content.js +0 -771
  61. package/airtable-clipper/releases/v1.0.0/icons/README.md +0 -69
  62. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +0 -2
  63. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +0 -3
  64. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +0 -2
  65. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +0 -2
  66. package/airtable-clipper/releases/v1.0.0/manifest.json +0 -73
  67. package/airtable-clipper/releases/v1.0.0/popup.html +0 -144
  68. package/airtable-clipper/releases/v1.0.0/popup.js +0 -475
  69. package/airtable-clipper/releases/v1.0.0/sidepanel.html +0 -25
  70. package/airtable-clipper/releases/v1.0.0/styles/content.css +0 -229
  71. package/airtable-clipper/releases/v1.0.0/styles/popup.css +0 -477
  72. package/airtable-clipper/releases/v1.0.1/background.js +0 -337
  73. package/airtable-clipper/releases/v1.0.1/base-setup.html +0 -324
  74. package/airtable-clipper/releases/v1.0.1/base-setup.js +0 -471
  75. package/airtable-clipper/releases/v1.0.1/content.js +0 -771
  76. package/airtable-clipper/releases/v1.0.1/icons/README.md +0 -69
  77. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +0 -2
  78. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +0 -3
  79. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +0 -2
  80. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +0 -2
  81. package/airtable-clipper/releases/v1.0.1/manifest.json +0 -70
  82. package/airtable-clipper/releases/v1.0.1/popup.html +0 -157
  83. package/airtable-clipper/releases/v1.0.1/popup.js +0 -562
  84. package/airtable-clipper/releases/v1.0.1/sidepanel.html +0 -25
  85. package/airtable-clipper/releases/v1.0.1/styles/content.css +0 -229
  86. package/airtable-clipper/releases/v1.0.1/styles/popup.css +0 -647
  87. package/airtable-clipper/releases/v1.0.2/background.js +0 -337
  88. package/airtable-clipper/releases/v1.0.2/base-setup.html +0 -324
  89. package/airtable-clipper/releases/v1.0.2/base-setup.js +0 -471
  90. package/airtable-clipper/releases/v1.0.2/content.js +0 -771
  91. package/airtable-clipper/releases/v1.0.2/icons/README.md +0 -69
  92. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +0 -2
  93. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +0 -3
  94. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +0 -2
  95. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +0 -2
  96. package/airtable-clipper/releases/v1.0.2/manifest.json +0 -62
  97. package/airtable-clipper/releases/v1.0.2/popup.html +0 -157
  98. package/airtable-clipper/releases/v1.0.2/popup.js +0 -567
  99. package/airtable-clipper/releases/v1.0.2/sidepanel.html +0 -25
  100. package/airtable-clipper/releases/v1.0.2/styles/content.css +0 -229
  101. package/airtable-clipper/releases/v1.0.2/styles/popup.css +0 -647
  102. package/airtable-clipper/terms-of-service.md +0 -124
  103. package/airtable-clipper/test-credentials.md +0 -61
  104. package/airtable-clipper/test-extension/background.js +0 -337
  105. package/airtable-clipper/test-extension/base-setup.html +0 -324
  106. package/airtable-clipper/test-extension/base-setup.js +0 -471
  107. package/airtable-clipper/test-extension/content.js +0 -873
  108. package/airtable-clipper/test-extension/icons/README.md +0 -69
  109. package/airtable-clipper/test-extension/icons/icon-128.png +0 -2
  110. package/airtable-clipper/test-extension/icons/icon-16.png +0 -3
  111. package/airtable-clipper/test-extension/icons/icon-32.png +0 -2
  112. package/airtable-clipper/test-extension/icons/icon-48.png +0 -2
  113. package/airtable-clipper/test-extension/manifest.json +0 -72
  114. package/airtable-clipper/test-extension/popup.html +0 -274
  115. package/airtable-clipper/test-extension/popup.js +0 -729
  116. package/airtable-clipper/test-extension/sidepanel.html +0 -25
  117. package/airtable-clipper/test-extension/styles/content.css +0 -229
  118. package/airtable-clipper/test-extension/styles/popup.css +0 -794
  119. package/airtable_mcp/__init__.py +0 -5
  120. package/airtable_mcp/src/server.py +0 -329
  121. package/airtable_mcp_v2.js +0 -1505
  122. package/airtable_mcp_v2_oauth.js +0 -1048
  123. package/airtable_mcp_v3_advanced.js +0 -1161
  124. package/cleanup.sh +0 -71
  125. package/docker-compose.production.yml +0 -366
  126. package/helm/airtable-mcp/Chart.yaml +0 -122
  127. package/helm/airtable-mcp/values.yaml +0 -538
  128. package/index.js +0 -179
  129. package/inspector.py +0 -148
  130. package/inspector_server.py +0 -337
  131. package/k8s/deployment.yaml +0 -402
  132. package/k8s/namespace.yaml +0 -108
  133. package/k8s/service.yaml +0 -194
  134. package/monitoring/alerts.yml +0 -289
  135. package/monitoring/prometheus.yml +0 -224
  136. package/publish-steps.txt +0 -27
  137. package/quick_test.sh +0 -30
  138. package/requirements.txt +0 -10
  139. package/setup.py +0 -29
  140. package/simple_airtable_server.py +0 -151
  141. package/smithery.yaml +0 -45
  142. package/test_all_features.sh +0 -146
  143. package/test_all_operations.sh +0 -120
  144. package/test_client.py +0 -70
  145. package/test_enhanced_features.js +0 -389
  146. package/test_mcp_comprehensive.js +0 -163
  147. package/test_mock_server.js +0 -180
  148. package/test_v1.4.0_final.sh +0 -131
  149. package/test_v1.5.0_comprehensive.sh +0 -96
  150. package/test_v1.5.0_final.sh +0 -224
  151. package/test_v1.6.0_comprehensive.sh +0 -187
  152. package/test_webhooks.sh +0 -105
@@ -1,389 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Test Script for Enhanced Airtable MCP v1.3.0
5
- * Tests all CRUD operations and new features
6
- */
7
-
8
- const http = require('http');
9
-
10
- // Test configuration - using environment variables
11
- const MCP_SERVER_URL = 'http://localhost:8010/mcp';
12
- const TEST_TOKEN = process.env.AIRTABLE_TOKEN || 'YOUR_AIRTABLE_TOKEN';
13
- const TEST_BASE_ID = process.env.AIRTABLE_BASE_ID || 'YOUR_BASE_ID';
14
-
15
- if (TEST_TOKEN === 'YOUR_AIRTABLE_TOKEN' || TEST_BASE_ID === 'YOUR_BASE_ID') {
16
- console.error('❌ Error: Please set AIRTABLE_TOKEN and AIRTABLE_BASE_ID environment variables');
17
- console.error('Example:');
18
- console.error(' export AIRTABLE_TOKEN=your_token_here');
19
- console.error(' export AIRTABLE_BASE_ID=your_base_id_here');
20
- process.exit(1);
21
- }
22
-
23
- // Test data
24
- let createdRecordId = null;
25
- const testTableName = 'Tasks'; // Change this to your actual table name
26
-
27
- // Helper function to make MCP requests
28
- function makeMCPRequest(method, params = {}) {
29
- return new Promise((resolve, reject) => {
30
- const postData = JSON.stringify({
31
- jsonrpc: '2.0',
32
- id: Date.now(),
33
- method: method,
34
- params: params
35
- });
36
-
37
- const options = {
38
- hostname: 'localhost',
39
- port: 8010,
40
- path: '/mcp',
41
- method: 'POST',
42
- headers: {
43
- 'Content-Type': 'application/json',
44
- 'Content-Length': Buffer.byteLength(postData)
45
- }
46
- };
47
-
48
- const req = http.request(options, (res) => {
49
- let data = '';
50
- res.on('data', (chunk) => {
51
- data += chunk;
52
- });
53
- res.on('end', () => {
54
- try {
55
- const response = JSON.parse(data);
56
- resolve(response);
57
- } catch (e) {
58
- reject(new Error(`Failed to parse response: ${e.message}\nRaw data: ${data}`));
59
- }
60
- });
61
- });
62
-
63
- req.on('error', (e) => {
64
- reject(new Error(`Request failed: ${e.message}`));
65
- });
66
-
67
- req.write(postData);
68
- req.end();
69
- });
70
- }
71
-
72
- // Test functions
73
- async function testListTools() {
74
- console.log('\n📋 TEST 1: List Available Tools');
75
- console.log('================================');
76
-
77
- try {
78
- const response = await makeMCPRequest('tools/list');
79
-
80
- if (response.result && response.result.tools) {
81
- console.log(`✅ Found ${response.result.tools.length} tools:`);
82
- response.result.tools.forEach(tool => {
83
- console.log(` - ${tool.name}: ${tool.description}`);
84
- });
85
- return true;
86
- } else {
87
- console.error('❌ No tools found in response');
88
- return false;
89
- }
90
- } catch (error) {
91
- console.error('❌ Error:', error.message);
92
- return false;
93
- }
94
- }
95
-
96
- async function testListTables() {
97
- console.log('\n📊 TEST 2: List Tables');
98
- console.log('======================');
99
-
100
- try {
101
- const response = await makeMCPRequest('tools/call', {
102
- name: 'list_tables'
103
- });
104
-
105
- if (response.result && response.result.content) {
106
- console.log('✅ Response:', response.result.content[0].text);
107
- return true;
108
- } else {
109
- console.error('❌ No content in response');
110
- return false;
111
- }
112
- } catch (error) {
113
- console.error('❌ Error:', error.message);
114
- return false;
115
- }
116
- }
117
-
118
- async function testCreateRecord() {
119
- console.log('\n➕ TEST 3: Create Record');
120
- console.log('========================');
121
-
122
- try {
123
- const response = await makeMCPRequest('tools/call', {
124
- name: 'create_record',
125
- arguments: {
126
- table: testTableName,
127
- fields: {
128
- 'Name': 'Test Task from MCP v1.3.0',
129
- 'Notes': 'This is a test record created by the enhanced MCP',
130
- 'Status': 'In progress'
131
- }
132
- }
133
- });
134
-
135
- if (response.result && response.result.content) {
136
- console.log('✅ Created record:', response.result.content[0].text);
137
-
138
- // Extract record ID from response
139
- const match = response.result.content[0].text.match(/Record ID: (rec\w+)/);
140
- if (match) {
141
- createdRecordId = match[1];
142
- console.log(`📝 Saved record ID: ${createdRecordId}`);
143
- }
144
- return true;
145
- } else {
146
- console.error('❌ Failed to create record');
147
- return false;
148
- }
149
- } catch (error) {
150
- console.error('❌ Error:', error.message);
151
- return false;
152
- }
153
- }
154
-
155
- async function testGetRecord() {
156
- console.log('\n🔍 TEST 4: Get Single Record');
157
- console.log('=============================');
158
-
159
- if (!createdRecordId) {
160
- console.log('⚠️ Skipping: No record ID available');
161
- return false;
162
- }
163
-
164
- try {
165
- const response = await makeMCPRequest('tools/call', {
166
- name: 'get_record',
167
- arguments: {
168
- table: testTableName,
169
- recordId: createdRecordId
170
- }
171
- });
172
-
173
- if (response.result && response.result.content) {
174
- console.log('✅ Retrieved record:', response.result.content[0].text);
175
- return true;
176
- } else {
177
- console.error('❌ Failed to retrieve record');
178
- return false;
179
- }
180
- } catch (error) {
181
- console.error('❌ Error:', error.message);
182
- return false;
183
- }
184
- }
185
-
186
- async function testUpdateRecord() {
187
- console.log('\n✏️ TEST 5: Update Record');
188
- console.log('=========================');
189
-
190
- if (!createdRecordId) {
191
- console.log('⚠️ Skipping: No record ID available');
192
- return false;
193
- }
194
-
195
- try {
196
- const response = await makeMCPRequest('tools/call', {
197
- name: 'update_record',
198
- arguments: {
199
- table: testTableName,
200
- recordId: createdRecordId,
201
- fields: {
202
- 'Status': 'Done',
203
- 'Notes': 'Updated by MCP test suite at ' + new Date().toISOString()
204
- }
205
- }
206
- });
207
-
208
- if (response.result && response.result.content) {
209
- console.log('✅ Updated record:', response.result.content[0].text);
210
- return true;
211
- } else {
212
- console.error('❌ Failed to update record');
213
- return false;
214
- }
215
- } catch (error) {
216
- console.error('❌ Error:', error.message);
217
- return false;
218
- }
219
- }
220
-
221
- async function testSearchRecords() {
222
- console.log('\n🔎 TEST 6: Search Records');
223
- console.log('=========================');
224
-
225
- try {
226
- const response = await makeMCPRequest('tools/call', {
227
- name: 'search_records',
228
- arguments: {
229
- table: testTableName,
230
- filterByFormula: "{Status} = 'Done'",
231
- maxRecords: 5,
232
- sort: [{field: 'Name', direction: 'asc'}]
233
- }
234
- });
235
-
236
- if (response.result && response.result.content) {
237
- console.log('✅ Search results:', response.result.content[0].text);
238
- return true;
239
- } else {
240
- console.error('❌ No search results');
241
- return false;
242
- }
243
- } catch (error) {
244
- console.error('❌ Error:', error.message);
245
- return false;
246
- }
247
- }
248
-
249
- async function testListRecords() {
250
- console.log('\n📝 TEST 7: List Records');
251
- console.log('=======================');
252
-
253
- try {
254
- const response = await makeMCPRequest('tools/call', {
255
- name: 'list_records',
256
- arguments: {
257
- table: testTableName,
258
- maxRecords: 3
259
- }
260
- });
261
-
262
- if (response.result && response.result.content) {
263
- console.log('✅ Listed records:', response.result.content[0].text.substring(0, 200) + '...');
264
- return true;
265
- } else {
266
- console.error('❌ Failed to list records');
267
- return false;
268
- }
269
- } catch (error) {
270
- console.error('❌ Error:', error.message);
271
- return false;
272
- }
273
- }
274
-
275
- async function testDeleteRecord() {
276
- console.log('\n🗑️ TEST 8: Delete Record');
277
- console.log('=========================');
278
-
279
- if (!createdRecordId) {
280
- console.log('⚠️ Skipping: No record ID available');
281
- return false;
282
- }
283
-
284
- try {
285
- const response = await makeMCPRequest('tools/call', {
286
- name: 'delete_record',
287
- arguments: {
288
- table: testTableName,
289
- recordId: createdRecordId
290
- }
291
- });
292
-
293
- if (response.result && response.result.content) {
294
- console.log('✅ Deleted record:', response.result.content[0].text);
295
- return true;
296
- } else {
297
- console.error('❌ Failed to delete record');
298
- return false;
299
- }
300
- } catch (error) {
301
- console.error('❌ Error:', error.message);
302
- return false;
303
- }
304
- }
305
-
306
- // Main test runner
307
- async function runTests() {
308
- console.log('🚀 Enhanced Airtable MCP v1.3.0 Test Suite');
309
- console.log('==========================================');
310
- console.log(`📍 Testing server at: ${MCP_SERVER_URL}`);
311
- console.log(`🔑 Token: ${TEST_TOKEN.slice(0, 5)}...${TEST_TOKEN.slice(-5)}`);
312
- console.log(`📦 Base ID: ${TEST_BASE_ID}`);
313
- console.log(`📊 Test table: ${testTableName}`);
314
-
315
- const tests = [
316
- { name: 'List Tools', fn: testListTools },
317
- { name: 'List Tables', fn: testListTables },
318
- { name: 'Create Record', fn: testCreateRecord },
319
- { name: 'Get Record', fn: testGetRecord },
320
- { name: 'Update Record', fn: testUpdateRecord },
321
- { name: 'Search Records', fn: testSearchRecords },
322
- { name: 'List Records', fn: testListRecords },
323
- { name: 'Delete Record', fn: testDeleteRecord }
324
- ];
325
-
326
- let passed = 0;
327
- let failed = 0;
328
-
329
- for (const test of tests) {
330
- try {
331
- const result = await test.fn();
332
- if (result) {
333
- passed++;
334
- } else {
335
- failed++;
336
- }
337
- } catch (error) {
338
- console.error(`❌ Test "${test.name}" crashed:`, error.message);
339
- failed++;
340
- }
341
-
342
- // Small delay between tests
343
- await new Promise(resolve => setTimeout(resolve, 1000));
344
- }
345
-
346
- console.log('\n' + '='.repeat(50));
347
- console.log('📊 TEST RESULTS SUMMARY');
348
- console.log('='.repeat(50));
349
- console.log(`✅ Passed: ${passed}/${tests.length}`);
350
- console.log(`❌ Failed: ${failed}/${tests.length}`);
351
- console.log(`📈 Success Rate: ${Math.round((passed/tests.length) * 100)}%`);
352
-
353
- if (failed === 0) {
354
- console.log('\n🎉 All tests passed! The enhanced MCP is working perfectly!');
355
- } else {
356
- console.log('\n⚠️ Some tests failed. Please check the errors above.');
357
- }
358
-
359
- process.exit(failed === 0 ? 0 : 1);
360
- }
361
-
362
- // Check if server is running
363
- async function checkServer() {
364
- try {
365
- await makeMCPRequest('tools/list');
366
- return true;
367
- } catch (error) {
368
- return false;
369
- }
370
- }
371
-
372
- // Main
373
- (async () => {
374
- console.log('🔍 Checking if MCP server is running...');
375
-
376
- const serverRunning = await checkServer();
377
-
378
- if (!serverRunning) {
379
- console.error('❌ MCP server is not running at ' + MCP_SERVER_URL);
380
- console.error('\nPlease start the server first:');
381
- console.error(' node airtable_enhanced.js --token YOUR_TOKEN --base YOUR_BASE_ID');
382
- process.exit(1);
383
- }
384
-
385
- console.log('✅ Server is running!\n');
386
-
387
- // Run tests
388
- await runTests();
389
- })();
@@ -1,163 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Comprehensive Test Script for Airtable MCP
5
- * Tests all available MCP tools and functionality
6
- */
7
-
8
- const http = require('http');
9
-
10
- const MCP_SERVER_URL = 'http://localhost:8010/mcp';
11
- const TEST_TOKEN = process.env.AIRTABLE_TOKEN || 'YOUR_AIRTABLE_TOKEN_HERE';
12
- const TEST_BASE_ID = process.env.AIRTABLE_BASE_ID || 'YOUR_BASE_ID_HERE';
13
-
14
- if (TEST_TOKEN === 'YOUR_AIRTABLE_TOKEN_HERE' || TEST_BASE_ID === 'YOUR_BASE_ID_HERE') {
15
- console.error('Error: Please set AIRTABLE_TOKEN and AIRTABLE_BASE_ID environment variables');
16
- console.error('Example: export AIRTABLE_TOKEN=your_token_here');
17
- console.error(' export AIRTABLE_BASE_ID=your_base_id_here');
18
- process.exit(1);
19
- }
20
-
21
- // Helper function to make MCP requests
22
- function makeMCPRequest(method, params = {}) {
23
- return new Promise((resolve, reject) => {
24
- const postData = JSON.stringify({
25
- jsonrpc: '2.0',
26
- id: Date.now(),
27
- method: method,
28
- params: params
29
- });
30
-
31
- const options = {
32
- hostname: 'localhost',
33
- port: 8010,
34
- path: '/mcp',
35
- method: 'POST',
36
- headers: {
37
- 'Content-Type': 'application/json',
38
- 'Content-Length': Buffer.byteLength(postData)
39
- }
40
- };
41
-
42
- const req = http.request(options, (res) => {
43
- let data = '';
44
- res.on('data', (chunk) => {
45
- data += chunk;
46
- });
47
- res.on('end', () => {
48
- try {
49
- const response = JSON.parse(data);
50
- resolve(response);
51
- } catch (e) {
52
- reject(new Error(`Failed to parse response: ${e.message}`));
53
- }
54
- });
55
- });
56
-
57
- req.on('error', (e) => {
58
- reject(new Error(`Request failed: ${e.message}`));
59
- });
60
-
61
- req.write(postData);
62
- req.end();
63
- });
64
- }
65
-
66
- async function runComprehensiveTest() {
67
- console.log('🔌 Airtable MCP Comprehensive Test');
68
- console.log('===================================');
69
- console.log(`Server: ${MCP_SERVER_URL}`);
70
- console.log(`Base ID: ${TEST_BASE_ID}`);
71
- console.log(`Token: ${TEST_TOKEN.substring(0, 10)}...${TEST_TOKEN.substring(TEST_TOKEN.length - 10)}`);
72
- console.log('');
73
-
74
- try {
75
- // Test 1: List Resources
76
- console.log('📋 Test 1: Listing Resources');
77
- console.log('----------------------------');
78
- const resourcesResponse = await makeMCPRequest('resources/list');
79
- console.log('✅ Resources Response:');
80
- console.log(JSON.stringify(resourcesResponse, null, 2));
81
- console.log('');
82
-
83
- // Test 2: List Prompts
84
- console.log('📝 Test 2: Listing Prompts');
85
- console.log('-------------------------');
86
- const promptsResponse = await makeMCPRequest('prompts/list');
87
- console.log('✅ Prompts Response:');
88
- console.log(JSON.stringify(promptsResponse, null, 2));
89
- console.log('');
90
-
91
- // Test 3: List Tables
92
- console.log('📊 Test 3: Listing Tables');
93
- console.log('------------------------');
94
- const tablesResponse = await makeMCPRequest('tools/call', {
95
- name: 'list_tables'
96
- });
97
- console.log('✅ Tables Response:');
98
- console.log(JSON.stringify(tablesResponse, null, 2));
99
- console.log('');
100
-
101
- // Test 4: List Records from Requests table
102
- console.log('📄 Test 4: Listing Records (Requests Table)');
103
- console.log('-------------------------------------------');
104
- const recordsResponse = await makeMCPRequest('tools/call', {
105
- name: 'list_records',
106
- arguments: {
107
- table_name: 'requests',
108
- max_records: 3
109
- }
110
- });
111
- console.log('✅ Records Response:');
112
- console.log(JSON.stringify(recordsResponse, null, 2));
113
- console.log('');
114
-
115
- // Test 5: List Records from Providers table
116
- console.log('👥 Test 5: Listing Records (Providers Table)');
117
- console.log('--------------------------------------------');
118
- const providersResponse = await makeMCPRequest('tools/call', {
119
- name: 'list_records',
120
- arguments: {
121
- table_name: 'providers',
122
- max_records: 3
123
- }
124
- });
125
- console.log('✅ Providers Response:');
126
- console.log(JSON.stringify(providersResponse, null, 2));
127
- console.log('');
128
-
129
- // Test 6: List Records from Categories table
130
- console.log('🏷️ Test 6: Listing Records (Categories Table)');
131
- console.log('---------------------------------------------');
132
- const categoriesResponse = await makeMCPRequest('tools/call', {
133
- name: 'list_records',
134
- arguments: {
135
- table_name: 'categories',
136
- max_records: 3
137
- }
138
- });
139
- console.log('✅ Categories Response:');
140
- console.log(JSON.stringify(categoriesResponse, null, 2));
141
- console.log('');
142
-
143
- console.log('🎉 All Tests Completed Successfully!');
144
- console.log('');
145
- console.log('📊 Test Summary:');
146
- console.log('✅ MCP Server is running and accessible');
147
- console.log('✅ Airtable API connection is working');
148
- console.log('✅ All MCP tools are functioning properly');
149
- console.log('✅ JSON-RPC protocol is correctly implemented');
150
- console.log('✅ Error handling is working');
151
- console.log('');
152
- console.log('🚀 The Airtable MCP is ready for use!');
153
-
154
- } catch (error) {
155
- console.error('❌ Test failed:', error.message);
156
- process.exit(1);
157
- }
158
- }
159
-
160
- // Run the comprehensive test
161
- runComprehensiveTest();
162
-
163
-