@rashidazarang/airtable-mcp 1.5.0 → 2.1.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 (119) hide show
  1. package/.github/ISSUE_TEMPLATE/bug-report.yml +173 -0
  2. package/.github/ISSUE_TEMPLATE/feature-request.yml +209 -0
  3. package/.github/ISSUE_TEMPLATE/security-report.yml +216 -0
  4. package/.github/pull_request_template.md +245 -0
  5. package/.github/workflows/ci-cd.yml +408 -0
  6. package/.github/workflows/security-audit.yml +316 -0
  7. package/API_DOCUMENTATION.md +897 -0
  8. package/CODE_OF_CONDUCT.md +181 -0
  9. package/Dockerfile.production +127 -0
  10. package/README.md +55 -10
  11. package/RELEASE_NOTES_v1.6.0.md +248 -0
  12. package/airtable-clipper/CHANGELOG.md +198 -0
  13. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +343 -0
  14. package/airtable-clipper/LAUNCH_STRATEGY.md +495 -0
  15. package/airtable-clipper/LICENSE +21 -0
  16. package/airtable-clipper/OAUTH_SETUP.md +51 -0
  17. package/airtable-clipper/PRIVACY_POLICY.md +187 -0
  18. package/airtable-clipper/README.md +575 -0
  19. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +273 -0
  20. package/airtable-clipper/build.sh +85 -0
  21. package/airtable-clipper/docs/QUICK_START.md +99 -0
  22. package/airtable-clipper/docs/SETUP.md +291 -0
  23. package/airtable-clipper/extension/background.js +337 -0
  24. package/airtable-clipper/extension/base-setup.html +324 -0
  25. package/airtable-clipper/extension/base-setup.js +471 -0
  26. package/airtable-clipper/extension/content.js +771 -0
  27. package/airtable-clipper/extension/icons/README.md +69 -0
  28. package/airtable-clipper/extension/icons/icon-16.png +3 -0
  29. package/airtable-clipper/extension/manifest.json +73 -0
  30. package/airtable-clipper/extension/popup.html +144 -0
  31. package/airtable-clipper/extension/popup.js +475 -0
  32. package/airtable-clipper/extension/styles/content.css +229 -0
  33. package/airtable-clipper/extension/styles/popup.css +477 -0
  34. package/airtable-clipper/privacy-policy.md +63 -0
  35. package/airtable-clipper/releases/v1.0.0/background.js +337 -0
  36. package/airtable-clipper/releases/v1.0.0/base-setup.html +324 -0
  37. package/airtable-clipper/releases/v1.0.0/base-setup.js +471 -0
  38. package/airtable-clipper/releases/v1.0.0/content.js +771 -0
  39. package/airtable-clipper/releases/v1.0.0/icons/README.md +69 -0
  40. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +2 -0
  41. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +3 -0
  42. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +2 -0
  43. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +2 -0
  44. package/airtable-clipper/releases/v1.0.0/manifest.json +73 -0
  45. package/airtable-clipper/releases/v1.0.0/popup.html +144 -0
  46. package/airtable-clipper/releases/v1.0.0/popup.js +475 -0
  47. package/airtable-clipper/releases/v1.0.0/sidepanel.html +25 -0
  48. package/airtable-clipper/releases/v1.0.0/styles/content.css +229 -0
  49. package/airtable-clipper/releases/v1.0.0/styles/popup.css +477 -0
  50. package/airtable-clipper/releases/v1.0.1/background.js +337 -0
  51. package/airtable-clipper/releases/v1.0.1/base-setup.html +324 -0
  52. package/airtable-clipper/releases/v1.0.1/base-setup.js +471 -0
  53. package/airtable-clipper/releases/v1.0.1/content.js +771 -0
  54. package/airtable-clipper/releases/v1.0.1/icons/README.md +69 -0
  55. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +2 -0
  56. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +3 -0
  57. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +2 -0
  58. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +2 -0
  59. package/airtable-clipper/releases/v1.0.1/manifest.json +70 -0
  60. package/airtable-clipper/releases/v1.0.1/popup.html +157 -0
  61. package/airtable-clipper/releases/v1.0.1/popup.js +562 -0
  62. package/airtable-clipper/releases/v1.0.1/sidepanel.html +25 -0
  63. package/airtable-clipper/releases/v1.0.1/styles/content.css +229 -0
  64. package/airtable-clipper/releases/v1.0.1/styles/popup.css +647 -0
  65. package/airtable-clipper/releases/v1.0.2/background.js +337 -0
  66. package/airtable-clipper/releases/v1.0.2/base-setup.html +324 -0
  67. package/airtable-clipper/releases/v1.0.2/base-setup.js +471 -0
  68. package/airtable-clipper/releases/v1.0.2/content.js +771 -0
  69. package/airtable-clipper/releases/v1.0.2/icons/README.md +69 -0
  70. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +2 -0
  71. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +3 -0
  72. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +2 -0
  73. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +2 -0
  74. package/airtable-clipper/releases/v1.0.2/manifest.json +62 -0
  75. package/airtable-clipper/releases/v1.0.2/popup.html +157 -0
  76. package/airtable-clipper/releases/v1.0.2/popup.js +567 -0
  77. package/airtable-clipper/releases/v1.0.2/sidepanel.html +25 -0
  78. package/airtable-clipper/releases/v1.0.2/styles/content.css +229 -0
  79. package/airtable-clipper/releases/v1.0.2/styles/popup.css +647 -0
  80. package/airtable-clipper/terms-of-service.md +124 -0
  81. package/airtable-clipper/test-credentials.md +61 -0
  82. package/airtable-clipper/test-extension/background.js +337 -0
  83. package/airtable-clipper/test-extension/base-setup.html +324 -0
  84. package/airtable-clipper/test-extension/base-setup.js +471 -0
  85. package/airtable-clipper/test-extension/content.js +873 -0
  86. package/airtable-clipper/test-extension/icons/README.md +69 -0
  87. package/airtable-clipper/test-extension/icons/icon-128.png +2 -0
  88. package/airtable-clipper/test-extension/icons/icon-16.png +3 -0
  89. package/airtable-clipper/test-extension/icons/icon-32.png +2 -0
  90. package/airtable-clipper/test-extension/icons/icon-48.png +2 -0
  91. package/airtable-clipper/test-extension/manifest.json +72 -0
  92. package/airtable-clipper/test-extension/popup.html +274 -0
  93. package/airtable-clipper/test-extension/popup.js +729 -0
  94. package/airtable-clipper/test-extension/sidepanel.html +25 -0
  95. package/airtable-clipper/test-extension/styles/content.css +229 -0
  96. package/airtable-clipper/test-extension/styles/popup.css +794 -0
  97. package/airtable_mcp_v2.js +1505 -0
  98. package/airtable_mcp_v2_oauth.js +1048 -0
  99. package/airtable_mcp_v3_advanced.js +1161 -0
  100. package/airtable_simple.js +447 -1
  101. package/airtable_simple_production.js +532 -0
  102. package/docker-compose.production.yml +366 -0
  103. package/helm/airtable-mcp/Chart.yaml +122 -0
  104. package/helm/airtable-mcp/values.yaml +538 -0
  105. package/k8s/deployment.yaml +402 -0
  106. package/k8s/namespace.yaml +108 -0
  107. package/k8s/service.yaml +194 -0
  108. package/monitoring/alerts.yml +289 -0
  109. package/monitoring/prometheus.yml +224 -0
  110. package/package.json +6 -6
  111. package/test_v1.6.0_comprehensive.sh +187 -0
  112. package/.claude/settings.local.json +0 -12
  113. package/airtable-mcp-1.1.0.tgz +0 -0
  114. package/airtable_enhanced.js +0 -499
  115. package/airtable_simple_v1.2.4_backup.js +0 -277
  116. package/airtable_v1.4.0.js +0 -654
  117. package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
  118. package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
  119. package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
@@ -0,0 +1,477 @@
1
+ /* Airtable Clipper Popup Styles */
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ width: 320px;
11
+ min-height: 400px;
12
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
13
+ font-size: 14px;
14
+ line-height: 1.5;
15
+ color: #1f2937;
16
+ background-color: #ffffff;
17
+ }
18
+
19
+ /* Header */
20
+ .header {
21
+ display: flex;
22
+ justify-content: space-between;
23
+ align-items: center;
24
+ padding: 16px;
25
+ border-bottom: 1px solid #e5e7eb;
26
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
27
+ color: white;
28
+ }
29
+
30
+ .logo {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 8px;
34
+ }
35
+
36
+ .logo-icon {
37
+ width: 24px;
38
+ height: 24px;
39
+ }
40
+
41
+ .logo h1 {
42
+ font-size: 16px;
43
+ font-weight: 600;
44
+ }
45
+
46
+ .connection-status {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 6px;
50
+ font-size: 12px;
51
+ }
52
+
53
+ .status-dot {
54
+ width: 8px;
55
+ height: 8px;
56
+ border-radius: 50%;
57
+ background-color: #ef4444;
58
+ }
59
+
60
+ .status-dot.connected {
61
+ background-color: #10b981;
62
+ }
63
+
64
+ .status-dot.connecting {
65
+ background-color: #f59e0b;
66
+ animation: pulse 2s infinite;
67
+ }
68
+
69
+ @keyframes pulse {
70
+ 0%, 100% { opacity: 1; }
71
+ 50% { opacity: 0.5; }
72
+ }
73
+
74
+ /* Quick Actions */
75
+ .quick-actions {
76
+ padding: 16px;
77
+ }
78
+
79
+ .action-btn {
80
+ display: flex;
81
+ align-items: center;
82
+ width: 100%;
83
+ padding: 12px;
84
+ border: none;
85
+ border-radius: 8px;
86
+ cursor: pointer;
87
+ transition: all 0.2s ease;
88
+ font-size: 14px;
89
+ font-weight: 500;
90
+ margin-bottom: 8px;
91
+ }
92
+
93
+ .action-btn.primary {
94
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
95
+ color: white;
96
+ box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);
97
+ }
98
+
99
+ .action-btn.primary:hover {
100
+ transform: translateY(-1px);
101
+ box-shadow: 0 4px 8px rgba(102, 126, 234, 0.4);
102
+ }
103
+
104
+ .action-btn.secondary {
105
+ background-color: #f3f4f6;
106
+ color: #374151;
107
+ border: 1px solid #d1d5db;
108
+ }
109
+
110
+ .action-btn.secondary:hover {
111
+ background-color: #e5e7eb;
112
+ }
113
+
114
+ .action-btn:disabled {
115
+ opacity: 0.5;
116
+ cursor: not-allowed;
117
+ transform: none !important;
118
+ }
119
+
120
+ .btn-icon {
121
+ font-size: 18px;
122
+ margin-right: 10px;
123
+ }
124
+
125
+ .btn-content {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ flex: 1;
130
+ }
131
+
132
+ .btn-text {
133
+ font-weight: 500;
134
+ }
135
+
136
+ .btn-subtext {
137
+ font-size: 12px;
138
+ opacity: 0.8;
139
+ margin-top: 2px;
140
+ }
141
+
142
+ .action-row {
143
+ display: grid;
144
+ grid-template-columns: 1fr 1fr;
145
+ gap: 8px;
146
+ }
147
+
148
+ .action-row .action-btn {
149
+ margin-bottom: 0;
150
+ padding: 10px 8px;
151
+ font-size: 13px;
152
+ }
153
+
154
+ .action-row .btn-text {
155
+ font-size: 12px;
156
+ }
157
+
158
+ /* Configuration */
159
+ .configuration {
160
+ padding: 16px;
161
+ }
162
+
163
+ .config-section h3 {
164
+ font-size: 16px;
165
+ font-weight: 600;
166
+ margin-bottom: 8px;
167
+ color: #111827;
168
+ }
169
+
170
+ .help-text {
171
+ font-size: 13px;
172
+ color: #6b7280;
173
+ margin-bottom: 16px;
174
+ }
175
+
176
+ .form-group {
177
+ margin-bottom: 16px;
178
+ }
179
+
180
+ .form-group label {
181
+ display: block;
182
+ font-size: 13px;
183
+ font-weight: 500;
184
+ margin-bottom: 4px;
185
+ color: #374151;
186
+ }
187
+
188
+ .form-group input,
189
+ .form-group select {
190
+ width: 100%;
191
+ padding: 8px 12px;
192
+ border: 1px solid #d1d5db;
193
+ border-radius: 6px;
194
+ font-size: 14px;
195
+ transition: border-color 0.2s ease;
196
+ }
197
+
198
+ .form-group input:focus,
199
+ .form-group select:focus {
200
+ outline: none;
201
+ border-color: #667eea;
202
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
203
+ }
204
+
205
+ .help-link {
206
+ display: inline-block;
207
+ font-size: 12px;
208
+ color: #667eea;
209
+ text-decoration: none;
210
+ margin-top: 4px;
211
+ }
212
+
213
+ .help-link:hover {
214
+ text-decoration: underline;
215
+ }
216
+
217
+ .btn {
218
+ padding: 10px 16px;
219
+ border: none;
220
+ border-radius: 6px;
221
+ font-size: 14px;
222
+ font-weight: 500;
223
+ cursor: pointer;
224
+ transition: all 0.2s ease;
225
+ }
226
+
227
+ .btn.primary {
228
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
229
+ color: white;
230
+ }
231
+
232
+ .btn.primary:hover {
233
+ transform: translateY(-1px);
234
+ box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);
235
+ }
236
+
237
+ .btn.full-width {
238
+ width: 100%;
239
+ }
240
+
241
+ .btn-loading {
242
+ margin-right: 8px;
243
+ }
244
+
245
+ /* Settings */
246
+ .settings {
247
+ padding: 16px;
248
+ border-top: 1px solid #e5e7eb;
249
+ }
250
+
251
+ .setting-item {
252
+ margin-bottom: 16px;
253
+ }
254
+
255
+ .setting-item label {
256
+ display: block;
257
+ font-size: 13px;
258
+ font-weight: 500;
259
+ margin-bottom: 4px;
260
+ color: #374151;
261
+ }
262
+
263
+ .setting-item select {
264
+ width: 100%;
265
+ padding: 6px 10px;
266
+ border: 1px solid #d1d5db;
267
+ border-radius: 4px;
268
+ font-size: 13px;
269
+ }
270
+
271
+ /* Checkbox styling */
272
+ .checkbox-label {
273
+ display: flex !important;
274
+ align-items: center;
275
+ cursor: pointer;
276
+ font-size: 13px !important;
277
+ margin-bottom: 0 !important;
278
+ }
279
+
280
+ .checkbox-label input[type="checkbox"] {
281
+ display: none;
282
+ }
283
+
284
+ .checkmark {
285
+ width: 16px;
286
+ height: 16px;
287
+ border: 2px solid #d1d5db;
288
+ border-radius: 3px;
289
+ margin-right: 8px;
290
+ position: relative;
291
+ transition: all 0.2s ease;
292
+ }
293
+
294
+ .checkbox-label input[type="checkbox"]:checked + .checkmark {
295
+ background-color: #667eea;
296
+ border-color: #667eea;
297
+ }
298
+
299
+ .checkbox-label input[type="checkbox"]:checked + .checkmark::after {
300
+ content: '✓';
301
+ position: absolute;
302
+ top: -2px;
303
+ left: 2px;
304
+ color: white;
305
+ font-size: 12px;
306
+ font-weight: bold;
307
+ }
308
+
309
+ /* Status Messages */
310
+ .status-message {
311
+ position: absolute;
312
+ top: 60px;
313
+ left: 16px;
314
+ right: 16px;
315
+ background-color: #f0fdf4;
316
+ border: 1px solid #bbf7d0;
317
+ border-radius: 6px;
318
+ padding: 12px;
319
+ z-index: 1000;
320
+ animation: slideIn 0.3s ease;
321
+ }
322
+
323
+ .status-message.error {
324
+ background-color: #fef2f2;
325
+ border-color: #fecaca;
326
+ }
327
+
328
+ .status-content {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 8px;
332
+ }
333
+
334
+ .status-icon {
335
+ font-size: 16px;
336
+ }
337
+
338
+ .status-text {
339
+ flex: 1;
340
+ font-size: 13px;
341
+ font-weight: 500;
342
+ }
343
+
344
+ .status-close {
345
+ background: none;
346
+ border: none;
347
+ font-size: 16px;
348
+ cursor: pointer;
349
+ color: #6b7280;
350
+ }
351
+
352
+ @keyframes slideIn {
353
+ from {
354
+ transform: translateY(-10px);
355
+ opacity: 0;
356
+ }
357
+ to {
358
+ transform: translateY(0);
359
+ opacity: 1;
360
+ }
361
+ }
362
+
363
+ /* Footer */
364
+ .footer {
365
+ border-top: 1px solid #e5e7eb;
366
+ padding: 12px 16px;
367
+ background-color: #f9fafb;
368
+ }
369
+
370
+ .footer-links {
371
+ display: flex;
372
+ justify-content: space-between;
373
+ margin-bottom: 8px;
374
+ }
375
+
376
+ .footer-link {
377
+ background: none;
378
+ border: none;
379
+ color: #667eea;
380
+ font-size: 12px;
381
+ cursor: pointer;
382
+ text-decoration: none;
383
+ }
384
+
385
+ .footer-link:hover {
386
+ text-decoration: underline;
387
+ }
388
+
389
+ .usage-info {
390
+ text-align: center;
391
+ }
392
+
393
+ .usage-text {
394
+ font-size: 11px;
395
+ color: #6b7280;
396
+ }
397
+
398
+ /* Loading Overlay */
399
+ .loading-overlay {
400
+ position: absolute;
401
+ top: 0;
402
+ left: 0;
403
+ right: 0;
404
+ bottom: 0;
405
+ background-color: rgba(255, 255, 255, 0.9);
406
+ display: flex;
407
+ flex-direction: column;
408
+ align-items: center;
409
+ justify-content: center;
410
+ z-index: 2000;
411
+ }
412
+
413
+ .loading-spinner {
414
+ width: 32px;
415
+ height: 32px;
416
+ border: 3px solid #e5e7eb;
417
+ border-top: 3px solid #667eea;
418
+ border-radius: 50%;
419
+ animation: spin 1s linear infinite;
420
+ margin-bottom: 12px;
421
+ }
422
+
423
+ .loading-text {
424
+ font-size: 14px;
425
+ color: #6b7280;
426
+ }
427
+
428
+ @keyframes spin {
429
+ 0% { transform: rotate(0deg); }
430
+ 100% { transform: rotate(360deg); }
431
+ }
432
+
433
+ /* Responsive adjustments */
434
+ @media (max-width: 350px) {
435
+ body {
436
+ width: 300px;
437
+ }
438
+
439
+ .action-row {
440
+ grid-template-columns: 1fr;
441
+ }
442
+ }
443
+
444
+ /* Dark mode support */
445
+ @media (prefers-color-scheme: dark) {
446
+ body {
447
+ background-color: #1f2937;
448
+ color: #f3f4f6;
449
+ }
450
+
451
+ .header {
452
+ border-bottom-color: #374151;
453
+ }
454
+
455
+ .action-btn.secondary {
456
+ background-color: #374151;
457
+ color: #f3f4f6;
458
+ border-color: #4b5563;
459
+ }
460
+
461
+ .action-btn.secondary:hover {
462
+ background-color: #4b5563;
463
+ }
464
+
465
+ .form-group input,
466
+ .form-group select,
467
+ .setting-item select {
468
+ background-color: #374151;
469
+ border-color: #4b5563;
470
+ color: #f3f4f6;
471
+ }
472
+
473
+ .footer {
474
+ background-color: #374151;
475
+ border-top-color: #4b5563;
476
+ }
477
+ }
@@ -0,0 +1,63 @@
1
+ # Privacy Policy for Airtable Clipper
2
+
3
+ **Last updated: August 15, 2025**
4
+
5
+ ## Overview
6
+
7
+ Airtable Clipper is a Chrome extension that allows users to save web content to their Airtable bases. We are committed to protecting your privacy and being transparent about our data practices.
8
+
9
+ ## Information We Collect
10
+
11
+ ### Authentication Information
12
+ - **Airtable Personal Access Token**: Stored locally in your browser to authenticate with your Airtable account
13
+ - **Airtable Base ID**: Stored locally to identify which Airtable base to save content to
14
+
15
+ ### Website Content
16
+ - **Page Information**: When you save a page, we collect the page title, URL, and any content you choose to save
17
+ - **LinkedIn Profile Data**: When saving LinkedIn profiles, we extract publicly available profile information (name, title, company, etc.)
18
+
19
+ ## How We Use Your Information
20
+
21
+ - **Authentication**: Your Airtable credentials are used solely to save content to your chosen Airtable base
22
+ - **Content Saving**: Website content is processed and sent directly to your Airtable base
23
+ - **Local Storage**: All authentication data is stored locally in your browser using Chrome's secure storage API
24
+
25
+ ## Data Sharing and Third Parties
26
+
27
+ - **No Data Sale**: We do not sell, rent, or trade your personal information to third parties
28
+ - **Airtable Integration**: Content is sent directly to your Airtable account via their official API
29
+ - **No External Servers**: We do not store your data on our servers or send it anywhere except directly to your Airtable account
30
+
31
+ ## Data Security
32
+
33
+ - **Local Storage**: Authentication credentials are stored securely in your browser using Chrome's encrypted storage
34
+ - **HTTPS**: All communications with Airtable use secure HTTPS connections
35
+ - **No Logging**: We do not log or track your usage of the extension
36
+
37
+ ## Data Retention
38
+
39
+ - **Local Storage**: Data is stored locally until you disconnect the extension or uninstall it
40
+ - **User Control**: You can disconnect and clear all stored data at any time through the extension's settings
41
+
42
+ ## Your Rights
43
+
44
+ - **Access**: You control all data stored by the extension
45
+ - **Deletion**: You can disconnect the extension to remove all stored authentication data
46
+ - **Portability**: All saved content goes directly to your Airtable account, which you control
47
+
48
+ ## Changes to This Policy
49
+
50
+ We may update this privacy policy occasionally. Changes will be posted on this page with an updated revision date.
51
+
52
+ ## Contact Us
53
+
54
+ If you have questions about this privacy policy or the extension, please contact us at:
55
+ - GitHub: https://github.com/rashidazarang/airtable-clipper/issues
56
+
57
+ ## Compliance
58
+
59
+ This extension complies with:
60
+ - Chrome Web Store Developer Program Policies
61
+ - General Data Protection Regulation (GDPR)
62
+ - California Consumer Privacy Act (CCPA)
63
+ - Airtable's Terms of Service and API Usage Guidelines