@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
@@ -1,538 +0,0 @@
1
- # Default values for Airtable MCP Server Helm Chart
2
- # Production-ready configuration for Trust Score 100/100
3
-
4
- # ============================================================================
5
- # GLOBAL CONFIGURATION
6
- # ============================================================================
7
- global:
8
- # Image registry and repository
9
- imageRegistry: ""
10
- imagePullSecrets: []
11
-
12
- # Trust Score configuration
13
- trustScore:
14
- target: 100
15
- features:
16
- - oauth2
17
- - security
18
- - monitoring
19
- - high-availability
20
- - production-ready
21
-
22
- # Security configuration
23
- security:
24
- podSecurityStandards: restricted
25
- networkPolicies: true
26
- secretManagement: external
27
-
28
- # ============================================================================
29
- # APPLICATION CONFIGURATION
30
- # ============================================================================
31
- image:
32
- registry: docker.io
33
- repository: rashidazarang/airtable-mcp
34
- tag: "2.1.0-production"
35
- digest: ""
36
- pullPolicy: IfNotPresent
37
-
38
- # Service account configuration
39
- serviceAccount:
40
- create: true
41
- automount: false
42
- annotations: {}
43
- name: ""
44
- labels: {}
45
-
46
- # Pod security context
47
- podSecurityContext:
48
- runAsNonRoot: true
49
- runAsUser: 1001
50
- runAsGroup: 1001
51
- fsGroup: 1001
52
- seccompProfile:
53
- type: RuntimeDefault
54
-
55
- # Container security context
56
- securityContext:
57
- allowPrivilegeEscalation: false
58
- readOnlyRootFilesystem: true
59
- runAsNonRoot: true
60
- runAsUser: 1001
61
- runAsGroup: 1001
62
- capabilities:
63
- drop:
64
- - ALL
65
- add:
66
- - NET_BIND_SERVICE
67
-
68
- # ============================================================================
69
- # DEPLOYMENT CONFIGURATION
70
- # ============================================================================
71
- replicaCount: 3
72
-
73
- # Deployment strategy
74
- strategy:
75
- type: RollingUpdate
76
- rollingUpdate:
77
- maxSurge: 1
78
- maxUnavailable: 0
79
-
80
- # Pod disruption budget
81
- podDisruptionBudget:
82
- enabled: true
83
- minAvailable: 2
84
- # maxUnavailable: 1
85
-
86
- # Node selection
87
- nodeSelector: {}
88
-
89
- # Tolerations
90
- tolerations: []
91
-
92
- # Affinity rules
93
- affinity:
94
- podAntiAffinity:
95
- preferredDuringSchedulingIgnoredDuringExecution:
96
- - weight: 100
97
- podAffinityTerm:
98
- labelSelector:
99
- matchExpressions:
100
- - key: app.kubernetes.io/name
101
- operator: In
102
- values:
103
- - airtable-mcp
104
- topologyKey: kubernetes.io/hostname
105
-
106
- # Topology spread constraints
107
- topologySpreadConstraints:
108
- - maxSkew: 1
109
- topologyKey: topology.kubernetes.io/zone
110
- whenUnsatisfiable: DoNotSchedule
111
- labelSelector:
112
- matchLabels:
113
- app.kubernetes.io/name: airtable-mcp
114
-
115
- # ============================================================================
116
- # SERVICE CONFIGURATION
117
- # ============================================================================
118
- service:
119
- type: ClusterIP
120
- port: 8010
121
- targetPort: http
122
- protocol: TCP
123
- annotations: {}
124
- labels: {}
125
-
126
- # Session affinity
127
- sessionAffinity: ClientIP
128
- sessionAffinityConfig:
129
- clientIP:
130
- timeoutSeconds: 300
131
-
132
- # Load balancer service
133
- loadBalancer:
134
- enabled: false
135
- type: LoadBalancer
136
- port: 80
137
- httpsPort: 443
138
- annotations: {}
139
- # Cloud-specific annotations
140
- aws:
141
- annotations:
142
- service.beta.kubernetes.io/aws-load-balancer-type: "external"
143
- service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
144
- gcp:
145
- annotations:
146
- cloud.google.com/neg: '{"ingress": true}'
147
- azure:
148
- annotations:
149
- service.beta.kubernetes.io/azure-load-balancer-internal: "false"
150
-
151
- # ============================================================================
152
- # INGRESS CONFIGURATION
153
- # ============================================================================
154
- ingress:
155
- enabled: true
156
- className: nginx
157
- annotations:
158
- nginx.ingress.kubernetes.io/rewrite-target: /
159
- nginx.ingress.kubernetes.io/ssl-redirect: "true"
160
- nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
161
- nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
162
- nginx.ingress.kubernetes.io/rate-limit: "100"
163
- nginx.ingress.kubernetes.io/rate-limit-window: "1m"
164
- cert-manager.io/cluster-issuer: "letsencrypt-prod"
165
- hosts:
166
- - host: mcp.example.com
167
- paths:
168
- - path: /
169
- pathType: Prefix
170
- tls:
171
- - secretName: airtable-mcp-tls
172
- hosts:
173
- - mcp.example.com
174
-
175
- # ============================================================================
176
- # ENVIRONMENT VARIABLES
177
- # ============================================================================
178
- env:
179
- # Application configuration
180
- NODE_ENV: production
181
- PORT: "8010"
182
- HOST: "0.0.0.0"
183
- LOG_LEVEL: "INFO"
184
- LOG_FORMAT: "json"
185
-
186
- # Performance configuration
187
- CACHE_TTL: "60"
188
- MAX_REQUESTS_PER_MINUTE: "60"
189
- CONNECTION_TIMEOUT: "30000"
190
- REQUEST_TIMEOUT: "10000"
191
-
192
- # Security configuration
193
- ALLOWED_ORIGINS: "*"
194
-
195
- # Monitoring
196
- ENABLE_METRICS: "true"
197
- METRICS_PORT: "9090"
198
-
199
- # Environment variables from secrets
200
- envFromSecret:
201
- enabled: true
202
- secretName: airtable-mcp-secrets
203
- keys:
204
- - AIRTABLE_TOKEN
205
- - AIRTABLE_BASE_ID
206
- - AIRTABLE_CLIENT_ID
207
- - AIRTABLE_CLIENT_SECRET
208
- - SESSION_SECRET
209
- - REDIS_PASSWORD
210
-
211
- # Environment variables from config maps
212
- envFromConfigMap:
213
- enabled: true
214
- configMapName: airtable-mcp-config
215
-
216
- # ============================================================================
217
- # SECRETS CONFIGURATION
218
- # ============================================================================
219
- secrets:
220
- create: true
221
- name: airtable-mcp-secrets
222
- annotations: {}
223
- labels: {}
224
- stringData: {}
225
- # External secret management
226
- external:
227
- enabled: false
228
- provider: "" # vault, aws-secrets-manager, azure-key-vault, etc.
229
-
230
- # ============================================================================
231
- # CONFIG MAP CONFIGURATION
232
- # ============================================================================
233
- configMap:
234
- create: true
235
- name: airtable-mcp-config
236
- annotations: {}
237
- labels: {}
238
- data:
239
- LOG_LEVEL: "INFO"
240
- MAX_REQUESTS_PER_MINUTE: "60"
241
- CACHE_TTL: "60"
242
- CONNECTION_TIMEOUT: "30000"
243
- REQUEST_TIMEOUT: "10000"
244
-
245
- # ============================================================================
246
- # PERSISTENCE CONFIGURATION
247
- # ============================================================================
248
- persistence:
249
- enabled: true
250
- storageClass: ""
251
- accessModes:
252
- - ReadWriteOnce
253
- size: 8Gi
254
- annotations: {}
255
-
256
- # Separate volumes
257
- logs:
258
- enabled: true
259
- size: 2Gi
260
- mountPath: /app/logs
261
- tmp:
262
- enabled: true
263
- size: 1Gi
264
- mountPath: /tmp
265
-
266
- # ============================================================================
267
- # RESOURCE CONFIGURATION
268
- # ============================================================================
269
- resources:
270
- limits:
271
- cpu: 1000m
272
- memory: 512Mi
273
- requests:
274
- cpu: 100m
275
- memory: 128Mi
276
-
277
- # ============================================================================
278
- # HEALTH CHECKS
279
- # ============================================================================
280
- livenessProbe:
281
- enabled: true
282
- httpGet:
283
- path: /health
284
- port: http
285
- scheme: HTTP
286
- initialDelaySeconds: 30
287
- periodSeconds: 30
288
- timeoutSeconds: 10
289
- successThreshold: 1
290
- failureThreshold: 3
291
-
292
- readinessProbe:
293
- enabled: true
294
- httpGet:
295
- path: /health
296
- port: http
297
- scheme: HTTP
298
- initialDelaySeconds: 5
299
- periodSeconds: 10
300
- timeoutSeconds: 5
301
- successThreshold: 1
302
- failureThreshold: 3
303
-
304
- startupProbe:
305
- enabled: true
306
- httpGet:
307
- path: /health
308
- port: http
309
- scheme: HTTP
310
- initialDelaySeconds: 10
311
- periodSeconds: 5
312
- timeoutSeconds: 3
313
- successThreshold: 1
314
- failureThreshold: 6
315
-
316
- # ============================================================================
317
- # AUTOSCALING CONFIGURATION
318
- # ============================================================================
319
- autoscaling:
320
- enabled: true
321
- minReplicas: 3
322
- maxReplicas: 10
323
- targetCPUUtilizationPercentage: 70
324
- targetMemoryUtilizationPercentage: 80
325
-
326
- # Behavior configuration
327
- behavior:
328
- scaleDown:
329
- stabilizationWindowSeconds: 300
330
- policies:
331
- - type: Percent
332
- value: 10
333
- periodSeconds: 60
334
- scaleUp:
335
- stabilizationWindowSeconds: 60
336
- policies:
337
- - type: Percent
338
- value: 50
339
- periodSeconds: 60
340
- - type: Pods
341
- value: 2
342
- periodSeconds: 60
343
- selectPolicy: Max
344
-
345
- # Custom metrics
346
- customMetrics:
347
- - type: Pods
348
- pods:
349
- metric:
350
- name: http_requests_per_second
351
- target:
352
- type: AverageValue
353
- averageValue: "30"
354
-
355
- # ============================================================================
356
- # REDIS CONFIGURATION
357
- # ============================================================================
358
- redis:
359
- enabled: true
360
- architecture: standalone
361
- auth:
362
- enabled: true
363
- password: "defaultpass"
364
- master:
365
- resources:
366
- limits:
367
- memory: 256Mi
368
- cpu: 250m
369
- requests:
370
- memory: 128Mi
371
- cpu: 100m
372
- persistence:
373
- enabled: true
374
- size: 8Gi
375
- metrics:
376
- enabled: true
377
-
378
- # External Redis configuration
379
- externalRedis:
380
- enabled: false
381
- host: ""
382
- port: 6379
383
- password: ""
384
- database: 0
385
-
386
- # ============================================================================
387
- # MONITORING CONFIGURATION
388
- # ============================================================================
389
- monitoring:
390
- # Service monitor for Prometheus
391
- serviceMonitor:
392
- enabled: true
393
- interval: 30s
394
- scrapeTimeout: 10s
395
- path: /metrics
396
- labels: {}
397
- annotations: {}
398
-
399
- # Prometheus configuration
400
- prometheus:
401
- enabled: true
402
- retention: 15d
403
- storageSize: 50Gi
404
- resources:
405
- limits:
406
- cpu: 2000m
407
- memory: 4Gi
408
- requests:
409
- cpu: 500m
410
- memory: 1Gi
411
-
412
- # Grafana configuration
413
- grafana:
414
- enabled: true
415
- adminPassword: "admin123"
416
- persistence:
417
- enabled: true
418
- size: 10Gi
419
- resources:
420
- limits:
421
- cpu: 500m
422
- memory: 512Mi
423
- requests:
424
- cpu: 100m
425
- memory: 256Mi
426
-
427
- # Alerting configuration
428
- alerting:
429
- enabled: true
430
- rules:
431
- critical: true
432
- warning: true
433
- security: true
434
- business: true
435
-
436
- # Alertmanager configuration
437
- alertmanager:
438
- enabled: true
439
- config:
440
- global:
441
- smtp_smarthost: 'localhost:587'
442
- smtp_from: 'alerts@example.com'
443
- route:
444
- group_by: ['alertname', 'cluster', 'service']
445
- group_wait: 10s
446
- group_interval: 10s
447
- repeat_interval: 1h
448
- receiver: 'web.hook'
449
- receivers:
450
- - name: 'web.hook'
451
- webhook_configs:
452
- - url: 'http://localhost:5001/'
453
-
454
- # ============================================================================
455
- # NETWORK POLICIES
456
- # ============================================================================
457
- networkPolicy:
458
- enabled: true
459
- policyTypes:
460
- - Ingress
461
- - Egress
462
-
463
- # Ingress rules
464
- ingress:
465
- - from:
466
- - namespaceSelector:
467
- matchLabels:
468
- name: ingress-nginx
469
- - namespaceSelector:
470
- matchLabels:
471
- name: monitoring
472
- ports:
473
- - protocol: TCP
474
- port: 8010
475
- - protocol: TCP
476
- port: 9090
477
-
478
- # Egress rules
479
- egress:
480
- - to: []
481
- ports:
482
- - protocol: TCP
483
- port: 443 # HTTPS
484
- - protocol: TCP
485
- port: 53 # DNS
486
- - protocol: UDP
487
- port: 53 # DNS
488
-
489
- # ============================================================================
490
- # TESTING CONFIGURATION
491
- # ============================================================================
492
- tests:
493
- enabled: true
494
- image:
495
- registry: docker.io
496
- repository: curlimages/curl
497
- tag: latest
498
-
499
- # Test scenarios
500
- scenarios:
501
- - name: health-check
502
- command: "curl -f http://airtable-mcp-service:8010/health"
503
- - name: metrics-check
504
- command: "curl -f http://airtable-mcp-service:9090/metrics"
505
- - name: api-check
506
- command: "curl -f -X POST http://airtable-mcp-service:8010/mcp -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\"}'"
507
-
508
- # ============================================================================
509
- # EXTRA RESOURCES
510
- # ============================================================================
511
- extraObjects: []
512
- # - apiVersion: v1
513
- # kind: Secret
514
- # metadata:
515
- # name: extra-secret
516
- # data:
517
- # key: value
518
-
519
- # Pod annotations
520
- podAnnotations:
521
- prometheus.io/scrape: "true"
522
- prometheus.io/port: "9090"
523
- prometheus.io/path: "/metrics"
524
-
525
- # Pod labels
526
- podLabels:
527
- trust.score: "100"
528
- security.tier: "restricted"
529
-
530
- # Common labels applied to all resources
531
- commonLabels:
532
- app.kubernetes.io/part-of: mcp-platform
533
- trust.score: "100"
534
-
535
- # Common annotations applied to all resources
536
- commonAnnotations:
537
- trust.score/target: "100"
538
- security.policy/tier: "restricted"
package/index.js DELETED
@@ -1,179 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const path = require('path');
4
- const { execSync } = require('child_process');
5
- const { spawn } = require('child_process');
6
-
7
- // Polyfill for AbortController in older Node.js versions
8
- if (typeof globalThis.AbortController === 'undefined') {
9
- globalThis.AbortController = class AbortController {
10
- constructor() {
11
- this.signal = {
12
- aborted: false,
13
- addEventListener: () => {},
14
- removeEventListener: () => {},
15
- dispatchEvent: () => true
16
- };
17
- }
18
- abort() {
19
- this.signal.aborted = true;
20
- }
21
- };
22
- console.log('ā„¹ļø Added AbortController polyfill for compatibility with older Node.js versions');
23
- }
24
-
25
- // Parse command-line arguments
26
- const args = process.argv.slice(2);
27
- let tokenIndex = args.indexOf('--token');
28
- let baseIndex = args.indexOf('--base');
29
- let configIndex = args.indexOf('--config');
30
-
31
- // Extract token, base ID and config
32
- const token = tokenIndex !== -1 && tokenIndex + 1 < args.length ? args[tokenIndex + 1] : null;
33
- const baseId = baseIndex !== -1 && baseIndex + 1 < args.length ? args[baseIndex + 1] : null;
34
- const config = configIndex !== -1 && configIndex + 1 < args.length ? args[configIndex + 1] : null;
35
-
36
- console.log('šŸ”Œ Airtable MCP - Connecting your AI to Airtable');
37
- console.log('-----------------------------------------------');
38
-
39
- // Find Python interpreter
40
- const getPythonPath = () => {
41
- try {
42
- const whichPython = execSync('which python3.10').toString().trim();
43
- return whichPython;
44
- } catch (e) {
45
- try {
46
- const whichPython = execSync('which python3').toString().trim();
47
- return whichPython;
48
- } catch (e) {
49
- return 'python';
50
- }
51
- }
52
- };
53
-
54
- // Check Python version
55
- const checkPythonVersion = (pythonPath) => {
56
- try {
57
- const versionStr = execSync(`${pythonPath} --version`).toString().trim();
58
- const versionMatch = versionStr.match(/Python (\d+)\.(\d+)/);
59
- if (versionMatch) {
60
- const major = parseInt(versionMatch[1]);
61
- const minor = parseInt(versionMatch[2]);
62
- return (major > 3 || (major === 3 && minor >= 10));
63
- }
64
- return false;
65
- } catch (e) {
66
- return false;
67
- }
68
- };
69
-
70
- const pythonPath = getPythonPath();
71
-
72
- // Verify Python compatibility
73
- if (!checkPythonVersion(pythonPath)) {
74
- console.error('āŒ Error: MCP SDK requires Python 3.10+');
75
- console.error('Please install Python 3.10 or newer and try again.');
76
- process.exit(1);
77
- }
78
-
79
- // We now use inspector_server.py instead of server.py
80
- const serverScript = path.join(__dirname, 'inspector_server.py');
81
-
82
- // Check if the script exists
83
- try {
84
- require('fs').accessSync(serverScript, require('fs').constants.F_OK);
85
- } catch (e) {
86
- console.error(`āŒ Error: Could not find server script at ${serverScript}`);
87
- console.error('Please make sure you have the complete package installed.');
88
- process.exit(1);
89
- }
90
-
91
- // Prepare arguments for the Python script
92
- const scriptArgs = [serverScript];
93
- if (token) {
94
- scriptArgs.push('--token', token);
95
- }
96
- if (baseId) {
97
- scriptArgs.push('--base', baseId);
98
- }
99
- if (config) {
100
- scriptArgs.push('--config', config);
101
-
102
- // Try to extract and log info from config
103
- try {
104
- const configObj = JSON.parse(config);
105
- if (configObj.airtable_token) {
106
- console.log('āœ… Using API token from config');
107
- }
108
- if (configObj.base_id) {
109
- console.log(`āœ… Using base ID from config: ${configObj.base_id}`);
110
- }
111
- } catch (e) {
112
- console.warn('āš ļø Could not parse config JSON, attempting to sanitize...');
113
-
114
- // Sanitize config JSON - fix common formatting issues
115
- try {
116
- // Remove any unexpected line breaks, extra quotes, and escape characters
117
- const sanitizedConfig = config
118
- .replace(/[\r\n]+/g, '')
119
- .replace(/\\+"/g, '"')
120
- .replace(/^"/, '')
121
- .replace(/"$/, '')
122
- .replace(/\\/g, '');
123
-
124
- // Try parsing it
125
- const configObj = JSON.parse(sanitizedConfig);
126
- if (configObj) {
127
- console.log('āœ… Successfully sanitized config JSON');
128
- // Update config with sanitized version
129
- scriptArgs[scriptArgs.indexOf(config)] = sanitizedConfig;
130
- config = sanitizedConfig;
131
-
132
- if (configObj.airtable_token) {
133
- console.log('āœ… Using API token from sanitized config');
134
- }
135
- if (configObj.base_id) {
136
- console.log(`āœ… Using base ID from sanitized config: ${configObj.base_id}`);
137
- }
138
- }
139
- } catch (sanitizeErr) {
140
- console.warn('āš ļø Could not sanitize config JSON, passing it directly to Python script');
141
- }
142
- }
143
- } else {
144
- if (token) {
145
- console.log('āœ… Using provided API token');
146
- } else {
147
- console.log('āš ļø No API token provided, will try to use .env file');
148
- }
149
-
150
- if (baseId) {
151
- console.log(`āœ… Using base ID: ${baseId}`);
152
- } else {
153
- console.log('ā„¹ļø No base ID provided, will need to set one later');
154
- }
155
- }
156
-
157
- // Execute the Python script
158
- const serverProcess = spawn(pythonPath, scriptArgs, {
159
- stdio: 'inherit',
160
- });
161
-
162
- // Handle process exit
163
- serverProcess.on('close', (code) => {
164
- if (code !== 0) {
165
- console.error(`āŒ Airtable MCP server exited with code ${code}`);
166
- }
167
- process.exit(code);
168
- });
169
-
170
- // Handle signals
171
- process.on('SIGINT', () => {
172
- console.log('\nšŸ‘‹ Shutting down Airtable MCP server...');
173
- serverProcess.kill('SIGINT');
174
- });
175
-
176
- process.on('SIGTERM', () => {
177
- console.log('\nšŸ‘‹ Shutting down Airtable MCP server...');
178
- serverProcess.kill('SIGTERM');
179
- });