@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.
- package/README.md +1 -1
- package/airtable_simple_production.js +387 -5
- package/examples/claude_simple_config.json +0 -9
- package/package.json +10 -1
- package/.github/ISSUE_TEMPLATE/bug-report.yml +0 -173
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/custom.md +0 -10
- package/.github/ISSUE_TEMPLATE/feature-request.yml +0 -209
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/ISSUE_TEMPLATE/security-report.yml +0 -216
- package/.github/pull_request_template.md +0 -245
- package/.github/workflows/ci-cd.yml +0 -408
- package/.github/workflows/security-audit.yml +0 -316
- package/API_DOCUMENTATION.md +0 -897
- package/CAPABILITY_REPORT.md +0 -118
- package/CLAUDE_INTEGRATION.md +0 -96
- package/CODE_OF_CONDUCT.md +0 -181
- package/CONTRIBUTING.md +0 -81
- package/DEVELOPMENT.md +0 -190
- package/Dockerfile +0 -39
- package/Dockerfile.node +0 -20
- package/Dockerfile.production +0 -127
- package/IMPROVEMENT_PROPOSAL.md +0 -371
- package/INSTALLATION.md +0 -183
- package/ISSUE_RESPONSES.md +0 -171
- package/MCP_REVIEW_SUMMARY.md +0 -142
- package/QUICK_START.md +0 -60
- package/RELEASE_NOTES_v1.2.0.md +0 -50
- package/RELEASE_NOTES_v1.2.1.md +0 -40
- package/RELEASE_NOTES_v1.2.2.md +0 -48
- package/RELEASE_NOTES_v1.2.3.md +0 -105
- package/RELEASE_NOTES_v1.2.4.md +0 -60
- package/RELEASE_NOTES_v1.4.0.md +0 -104
- package/RELEASE_NOTES_v1.5.0.md +0 -185
- package/RELEASE_NOTES_v1.6.0.md +0 -248
- package/SECURITY_NOTICE.md +0 -40
- package/airtable-clipper/CHANGELOG.md +0 -198
- package/airtable-clipper/CHROME_STORE_SUBMISSION.md +0 -343
- package/airtable-clipper/LAUNCH_STRATEGY.md +0 -495
- package/airtable-clipper/LICENSE +0 -21
- package/airtable-clipper/OAUTH_SETUP.md +0 -51
- package/airtable-clipper/PRIVACY_POLICY.md +0 -187
- package/airtable-clipper/README.md +0 -575
- package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +0 -273
- package/airtable-clipper/build.sh +0 -85
- package/airtable-clipper/docs/QUICK_START.md +0 -99
- package/airtable-clipper/docs/SETUP.md +0 -291
- package/airtable-clipper/extension/background.js +0 -337
- package/airtable-clipper/extension/base-setup.html +0 -324
- package/airtable-clipper/extension/base-setup.js +0 -471
- package/airtable-clipper/extension/content.js +0 -771
- package/airtable-clipper/extension/icons/README.md +0 -69
- package/airtable-clipper/extension/icons/icon-16.png +0 -3
- package/airtable-clipper/extension/manifest.json +0 -73
- package/airtable-clipper/extension/popup.html +0 -144
- package/airtable-clipper/extension/popup.js +0 -475
- package/airtable-clipper/extension/styles/content.css +0 -229
- package/airtable-clipper/extension/styles/popup.css +0 -477
- package/airtable-clipper/privacy-policy.md +0 -63
- package/airtable-clipper/releases/v1.0.0/background.js +0 -337
- package/airtable-clipper/releases/v1.0.0/base-setup.html +0 -324
- package/airtable-clipper/releases/v1.0.0/base-setup.js +0 -471
- package/airtable-clipper/releases/v1.0.0/content.js +0 -771
- package/airtable-clipper/releases/v1.0.0/icons/README.md +0 -69
- package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +0 -2
- package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +0 -3
- package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +0 -2
- package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +0 -2
- package/airtable-clipper/releases/v1.0.0/manifest.json +0 -73
- package/airtable-clipper/releases/v1.0.0/popup.html +0 -144
- package/airtable-clipper/releases/v1.0.0/popup.js +0 -475
- package/airtable-clipper/releases/v1.0.0/sidepanel.html +0 -25
- package/airtable-clipper/releases/v1.0.0/styles/content.css +0 -229
- package/airtable-clipper/releases/v1.0.0/styles/popup.css +0 -477
- package/airtable-clipper/releases/v1.0.1/background.js +0 -337
- package/airtable-clipper/releases/v1.0.1/base-setup.html +0 -324
- package/airtable-clipper/releases/v1.0.1/base-setup.js +0 -471
- package/airtable-clipper/releases/v1.0.1/content.js +0 -771
- package/airtable-clipper/releases/v1.0.1/icons/README.md +0 -69
- package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +0 -2
- package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +0 -3
- package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +0 -2
- package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +0 -2
- package/airtable-clipper/releases/v1.0.1/manifest.json +0 -70
- package/airtable-clipper/releases/v1.0.1/popup.html +0 -157
- package/airtable-clipper/releases/v1.0.1/popup.js +0 -562
- package/airtable-clipper/releases/v1.0.1/sidepanel.html +0 -25
- package/airtable-clipper/releases/v1.0.1/styles/content.css +0 -229
- package/airtable-clipper/releases/v1.0.1/styles/popup.css +0 -647
- package/airtable-clipper/releases/v1.0.2/background.js +0 -337
- package/airtable-clipper/releases/v1.0.2/base-setup.html +0 -324
- package/airtable-clipper/releases/v1.0.2/base-setup.js +0 -471
- package/airtable-clipper/releases/v1.0.2/content.js +0 -771
- package/airtable-clipper/releases/v1.0.2/icons/README.md +0 -69
- package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +0 -2
- package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +0 -3
- package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +0 -2
- package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +0 -2
- package/airtable-clipper/releases/v1.0.2/manifest.json +0 -62
- package/airtable-clipper/releases/v1.0.2/popup.html +0 -157
- package/airtable-clipper/releases/v1.0.2/popup.js +0 -567
- package/airtable-clipper/releases/v1.0.2/sidepanel.html +0 -25
- package/airtable-clipper/releases/v1.0.2/styles/content.css +0 -229
- package/airtable-clipper/releases/v1.0.2/styles/popup.css +0 -647
- package/airtable-clipper/terms-of-service.md +0 -124
- package/airtable-clipper/test-credentials.md +0 -61
- package/airtable-clipper/test-extension/background.js +0 -337
- package/airtable-clipper/test-extension/base-setup.html +0 -324
- package/airtable-clipper/test-extension/base-setup.js +0 -471
- package/airtable-clipper/test-extension/content.js +0 -873
- package/airtable-clipper/test-extension/icons/README.md +0 -69
- package/airtable-clipper/test-extension/icons/icon-128.png +0 -2
- package/airtable-clipper/test-extension/icons/icon-16.png +0 -3
- package/airtable-clipper/test-extension/icons/icon-32.png +0 -2
- package/airtable-clipper/test-extension/icons/icon-48.png +0 -2
- package/airtable-clipper/test-extension/manifest.json +0 -72
- package/airtable-clipper/test-extension/popup.html +0 -274
- package/airtable-clipper/test-extension/popup.js +0 -729
- package/airtable-clipper/test-extension/sidepanel.html +0 -25
- package/airtable-clipper/test-extension/styles/content.css +0 -229
- package/airtable-clipper/test-extension/styles/popup.css +0 -794
- package/airtable_mcp/__init__.py +0 -5
- package/airtable_mcp/src/server.py +0 -329
- package/airtable_mcp_v2.js +0 -1505
- package/airtable_mcp_v2_oauth.js +0 -1048
- package/airtable_mcp_v3_advanced.js +0 -1161
- package/cleanup.sh +0 -71
- package/docker-compose.production.yml +0 -366
- package/helm/airtable-mcp/Chart.yaml +0 -122
- package/helm/airtable-mcp/values.yaml +0 -538
- package/index.js +0 -179
- package/inspector.py +0 -148
- package/inspector_server.py +0 -337
- package/k8s/deployment.yaml +0 -402
- package/k8s/namespace.yaml +0 -108
- package/k8s/service.yaml +0 -194
- package/monitoring/alerts.yml +0 -289
- package/monitoring/prometheus.yml +0 -224
- package/publish-steps.txt +0 -27
- package/quick_test.sh +0 -30
- package/requirements.txt +0 -10
- package/setup.py +0 -29
- package/simple_airtable_server.py +0 -151
- package/smithery.yaml +0 -45
- package/test_all_features.sh +0 -146
- package/test_all_operations.sh +0 -120
- package/test_client.py +0 -70
- package/test_enhanced_features.js +0 -389
- package/test_mcp_comprehensive.js +0 -163
- package/test_mock_server.js +0 -180
- package/test_v1.4.0_final.sh +0 -131
- package/test_v1.5.0_comprehensive.sh +0 -96
- package/test_v1.5.0_final.sh +0 -224
- package/test_v1.6.0_comprehensive.sh +0 -187
- 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
|
-
});
|