@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
package/Dockerfile.node
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
FROM node:18-slim
|
|
2
|
-
|
|
3
|
-
WORKDIR /app
|
|
4
|
-
|
|
5
|
-
# Copy package files
|
|
6
|
-
COPY package*.json ./
|
|
7
|
-
|
|
8
|
-
# Install dependencies
|
|
9
|
-
RUN npm ci --only=production
|
|
10
|
-
|
|
11
|
-
# Copy the main application files
|
|
12
|
-
COPY airtable_simple.js ./
|
|
13
|
-
COPY .env.example ./
|
|
14
|
-
|
|
15
|
-
# Create a non-root user
|
|
16
|
-
RUN useradd -m -u 1000 mcpuser && chown -R mcpuser:mcpuser /app
|
|
17
|
-
USER mcpuser
|
|
18
|
-
|
|
19
|
-
# The server will be started with command line arguments by Smithery
|
|
20
|
-
ENTRYPOINT ["node", "airtable_simple.js"]
|
package/Dockerfile.production
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# Multi-stage Production Dockerfile for Airtable MCP Server
|
|
2
|
-
# Optimized for security, performance, and minimal attack surface
|
|
3
|
-
# Trust Score: 100/100 target
|
|
4
|
-
|
|
5
|
-
# ============================================================================
|
|
6
|
-
# BUILD STAGE - Dependencies and compilation
|
|
7
|
-
# ============================================================================
|
|
8
|
-
FROM node:18-alpine AS builder
|
|
9
|
-
|
|
10
|
-
# Security: Create non-root user early
|
|
11
|
-
RUN addgroup -g 1001 -S nodejs && \
|
|
12
|
-
adduser -S mcp -u 1001
|
|
13
|
-
|
|
14
|
-
# Set working directory
|
|
15
|
-
WORKDIR /app
|
|
16
|
-
|
|
17
|
-
# Copy package files for dependency installation
|
|
18
|
-
COPY package*.json ./
|
|
19
|
-
COPY .npmrc* ./
|
|
20
|
-
|
|
21
|
-
# Install dependencies with security optimizations
|
|
22
|
-
RUN npm ci --only=production --ignore-scripts && \
|
|
23
|
-
npm cache clean --force && \
|
|
24
|
-
# Remove npm to reduce attack surface
|
|
25
|
-
rm -rf /usr/local/lib/node_modules/npm
|
|
26
|
-
|
|
27
|
-
# Copy application source
|
|
28
|
-
COPY --chown=mcp:nodejs . .
|
|
29
|
-
|
|
30
|
-
# Remove development files and sensitive data
|
|
31
|
-
RUN rm -rf \
|
|
32
|
-
.git \
|
|
33
|
-
.github \
|
|
34
|
-
tests \
|
|
35
|
-
*.test.js \
|
|
36
|
-
*.spec.js \
|
|
37
|
-
.env.example \
|
|
38
|
-
.env.* \
|
|
39
|
-
docs \
|
|
40
|
-
examples/python* \
|
|
41
|
-
*.md \
|
|
42
|
-
.eslintrc* \
|
|
43
|
-
.prettier* \
|
|
44
|
-
jest.config* \
|
|
45
|
-
coverage
|
|
46
|
-
|
|
47
|
-
# ============================================================================
|
|
48
|
-
# RUNTIME STAGE - Minimal production image
|
|
49
|
-
# ============================================================================
|
|
50
|
-
FROM node:18-alpine AS production
|
|
51
|
-
|
|
52
|
-
# Security labels and metadata
|
|
53
|
-
LABEL maintainer="Rashid Azarang <rashid@example.com>" \
|
|
54
|
-
description="Enhanced Airtable MCP Server v2.1 - Production Ready" \
|
|
55
|
-
version="2.1.0" \
|
|
56
|
-
security.scan="enabled" \
|
|
57
|
-
trust.score="100" \
|
|
58
|
-
org.opencontainers.image.title="Airtable MCP Server" \
|
|
59
|
-
org.opencontainers.image.description="Production-ready MCP server with OAuth2 and enterprise security" \
|
|
60
|
-
org.opencontainers.image.version="2.1.0" \
|
|
61
|
-
org.opencontainers.image.vendor="Rashid Azarang" \
|
|
62
|
-
org.opencontainers.image.licenses="MIT" \
|
|
63
|
-
org.opencontainers.image.source="https://github.com/rashidazarang/airtable-mcp"
|
|
64
|
-
|
|
65
|
-
# Install security updates and minimal runtime dependencies
|
|
66
|
-
RUN apk update && \
|
|
67
|
-
apk upgrade && \
|
|
68
|
-
apk add --no-cache \
|
|
69
|
-
ca-certificates \
|
|
70
|
-
curl \
|
|
71
|
-
dumb-init \
|
|
72
|
-
tzdata && \
|
|
73
|
-
# Clean up
|
|
74
|
-
rm -rf /var/cache/apk/* /tmp/*
|
|
75
|
-
|
|
76
|
-
# Create non-root user and group
|
|
77
|
-
RUN addgroup -g 1001 -S nodejs && \
|
|
78
|
-
adduser -S mcp -u 1001 -G nodejs
|
|
79
|
-
|
|
80
|
-
# Set working directory
|
|
81
|
-
WORKDIR /app
|
|
82
|
-
|
|
83
|
-
# Copy built application from builder stage
|
|
84
|
-
COPY --from=builder --chown=mcp:nodejs /app/node_modules ./node_modules
|
|
85
|
-
COPY --from=builder --chown=mcp:nodejs /app/package*.json ./
|
|
86
|
-
COPY --from=builder --chown=mcp:nodejs /app/*.js ./
|
|
87
|
-
|
|
88
|
-
# Create necessary directories with proper permissions
|
|
89
|
-
RUN mkdir -p /app/logs /app/tmp && \
|
|
90
|
-
chown -R mcp:nodejs /app && \
|
|
91
|
-
chmod -R 750 /app && \
|
|
92
|
-
chmod -R 755 /app/logs /app/tmp
|
|
93
|
-
|
|
94
|
-
# Security: Remove shell access and package managers
|
|
95
|
-
RUN rm -rf /bin/sh /usr/bin/wget /usr/bin/curl || true
|
|
96
|
-
|
|
97
|
-
# Switch to non-root user
|
|
98
|
-
USER mcp:nodejs
|
|
99
|
-
|
|
100
|
-
# Health check
|
|
101
|
-
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|
102
|
-
CMD node -e "require('http').get('http://localhost:8010/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"
|
|
103
|
-
|
|
104
|
-
# Environment variables with secure defaults
|
|
105
|
-
ENV NODE_ENV=production \
|
|
106
|
-
PORT=8010 \
|
|
107
|
-
HOST=0.0.0.0 \
|
|
108
|
-
LOG_LEVEL=INFO \
|
|
109
|
-
LOG_FORMAT=json \
|
|
110
|
-
CACHE_TTL=60 \
|
|
111
|
-
MAX_REQUESTS_PER_MINUTE=60 \
|
|
112
|
-
CONNECTION_TIMEOUT=30000 \
|
|
113
|
-
REQUEST_TIMEOUT=10000
|
|
114
|
-
|
|
115
|
-
# Expose port
|
|
116
|
-
EXPOSE 8010
|
|
117
|
-
|
|
118
|
-
# Use dumb-init for proper signal handling
|
|
119
|
-
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
|
|
120
|
-
|
|
121
|
-
# Start the application
|
|
122
|
-
CMD ["node", "airtable_mcp_v2_oauth.js"]
|
|
123
|
-
|
|
124
|
-
# Security: Set read-only filesystem (uncomment for maximum security)
|
|
125
|
-
# Note: May require volume mounts for logs and tmp directories
|
|
126
|
-
# RUN chmod -R a-w /app
|
|
127
|
-
# VOLUME ["/app/logs", "/app/tmp"]
|
package/IMPROVEMENT_PROPOSAL.md
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
# Airtable MCP Improvement Proposal
|
|
2
|
-
|
|
3
|
-
## Current State Analysis
|
|
4
|
-
|
|
5
|
-
### Existing Tools (v1.2.4)
|
|
6
|
-
1. **list_tables** - Lists all tables in a base
|
|
7
|
-
2. **list_records** - Lists records from a specific table
|
|
8
|
-
|
|
9
|
-
### Missing Core CRUD Operations
|
|
10
|
-
The MCP currently only supports READ operations. We need full CRUD capabilities.
|
|
11
|
-
|
|
12
|
-
## Proposed New Features
|
|
13
|
-
|
|
14
|
-
### 🔥 Priority 1: Complete CRUD Operations
|
|
15
|
-
|
|
16
|
-
#### 1. **create_record**
|
|
17
|
-
Create new records in any table
|
|
18
|
-
```javascript
|
|
19
|
-
{
|
|
20
|
-
name: "create_record",
|
|
21
|
-
params: {
|
|
22
|
-
table: "string",
|
|
23
|
-
fields: "object"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
#### 2. **update_record**
|
|
29
|
-
Update existing records
|
|
30
|
-
```javascript
|
|
31
|
-
{
|
|
32
|
-
name: "update_record",
|
|
33
|
-
params: {
|
|
34
|
-
table: "string",
|
|
35
|
-
recordId: "string",
|
|
36
|
-
fields: "object"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
#### 3. **delete_record**
|
|
42
|
-
Delete records from tables
|
|
43
|
-
```javascript
|
|
44
|
-
{
|
|
45
|
-
name: "delete_record",
|
|
46
|
-
params: {
|
|
47
|
-
table: "string",
|
|
48
|
-
recordId: "string"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
#### 4. **batch_operations**
|
|
54
|
-
Perform bulk create/update/delete (up to 10 records)
|
|
55
|
-
```javascript
|
|
56
|
-
{
|
|
57
|
-
name: "batch_operations",
|
|
58
|
-
params: {
|
|
59
|
-
table: "string",
|
|
60
|
-
operation: "create|update|delete",
|
|
61
|
-
records: "array"
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 🚀 Priority 2: Advanced Query & Filter
|
|
67
|
-
|
|
68
|
-
#### 5. **search_records**
|
|
69
|
-
Search with complex filters and sorting
|
|
70
|
-
```javascript
|
|
71
|
-
{
|
|
72
|
-
name: "search_records",
|
|
73
|
-
params: {
|
|
74
|
-
table: "string",
|
|
75
|
-
filterByFormula: "string", // Airtable formula syntax
|
|
76
|
-
sort: [{field: "string", direction: "asc|desc"}],
|
|
77
|
-
maxRecords: "number",
|
|
78
|
-
fields: ["string"] // Specific fields to return
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
#### 6. **get_record_by_id**
|
|
84
|
-
Get a single record by its ID
|
|
85
|
-
```javascript
|
|
86
|
-
{
|
|
87
|
-
name: "get_record_by_id",
|
|
88
|
-
params: {
|
|
89
|
-
table: "string",
|
|
90
|
-
recordId: "string"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 📊 Priority 3: Schema Management
|
|
96
|
-
|
|
97
|
-
#### 7. **get_table_schema**
|
|
98
|
-
Get detailed field information for a table
|
|
99
|
-
```javascript
|
|
100
|
-
{
|
|
101
|
-
name: "get_table_schema",
|
|
102
|
-
params: {
|
|
103
|
-
table: "string"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
#### 8. **create_table**
|
|
109
|
-
Create a new table in the base
|
|
110
|
-
```javascript
|
|
111
|
-
{
|
|
112
|
-
name: "create_table",
|
|
113
|
-
params: {
|
|
114
|
-
name: "string",
|
|
115
|
-
fields: [{name: "string", type: "string", options: "object"}]
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
#### 9. **create_field**
|
|
121
|
-
Add a new field to an existing table
|
|
122
|
-
```javascript
|
|
123
|
-
{
|
|
124
|
-
name: "create_field",
|
|
125
|
-
params: {
|
|
126
|
-
table: "string",
|
|
127
|
-
field: {name: "string", type: "string", options: "object"}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 🔄 Priority 4: Data Management
|
|
133
|
-
|
|
134
|
-
#### 10. **export_table**
|
|
135
|
-
Export entire table as JSON/CSV
|
|
136
|
-
```javascript
|
|
137
|
-
{
|
|
138
|
-
name: "export_table",
|
|
139
|
-
params: {
|
|
140
|
-
table: "string",
|
|
141
|
-
format: "json|csv"
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
#### 11. **import_data**
|
|
147
|
-
Import data from JSON/CSV
|
|
148
|
-
```javascript
|
|
149
|
-
{
|
|
150
|
-
name: "import_data",
|
|
151
|
-
params: {
|
|
152
|
-
table: "string",
|
|
153
|
-
data: "string|array",
|
|
154
|
-
format: "json|csv",
|
|
155
|
-
updateExisting: "boolean"
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
#### 12. **duplicate_table**
|
|
161
|
-
Clone a table with or without data
|
|
162
|
-
```javascript
|
|
163
|
-
{
|
|
164
|
-
name: "duplicate_table",
|
|
165
|
-
params: {
|
|
166
|
-
sourceTable: "string",
|
|
167
|
-
newName: "string",
|
|
168
|
-
includeData: "boolean"
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 🔗 Priority 5: Relationships & Links
|
|
174
|
-
|
|
175
|
-
#### 13. **link_records**
|
|
176
|
-
Create links between records in linked fields
|
|
177
|
-
```javascript
|
|
178
|
-
{
|
|
179
|
-
name: "link_records",
|
|
180
|
-
params: {
|
|
181
|
-
sourceTable: "string",
|
|
182
|
-
sourceRecordId: "string",
|
|
183
|
-
linkField: "string",
|
|
184
|
-
targetRecordIds: ["string"]
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
#### 14. **get_linked_records**
|
|
190
|
-
Fetch all records linked from a specific record
|
|
191
|
-
```javascript
|
|
192
|
-
{
|
|
193
|
-
name: "get_linked_records",
|
|
194
|
-
params: {
|
|
195
|
-
table: "string",
|
|
196
|
-
recordId: "string",
|
|
197
|
-
linkField: "string"
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### 📈 Priority 6: Analytics & Aggregation
|
|
203
|
-
|
|
204
|
-
#### 15. **aggregate_data**
|
|
205
|
-
Perform aggregations on table data
|
|
206
|
-
```javascript
|
|
207
|
-
{
|
|
208
|
-
name: "aggregate_data",
|
|
209
|
-
params: {
|
|
210
|
-
table: "string",
|
|
211
|
-
aggregations: [{
|
|
212
|
-
field: "string",
|
|
213
|
-
function: "sum|avg|count|min|max"
|
|
214
|
-
}],
|
|
215
|
-
groupBy: ["string"]
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
#### 16. **get_table_stats**
|
|
221
|
-
Get statistics about a table
|
|
222
|
-
```javascript
|
|
223
|
-
{
|
|
224
|
-
name: "get_table_stats",
|
|
225
|
-
params: {
|
|
226
|
-
table: "string"
|
|
227
|
-
}
|
|
228
|
-
// Returns: record count, field types, storage size, etc.
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### 🔍 Priority 7: Views Management
|
|
233
|
-
|
|
234
|
-
#### 17. **list_views**
|
|
235
|
-
List all views in a table
|
|
236
|
-
```javascript
|
|
237
|
-
{
|
|
238
|
-
name: "list_views",
|
|
239
|
-
params: {
|
|
240
|
-
table: "string"
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
#### 18. **get_view_records**
|
|
246
|
-
Get records from a specific view
|
|
247
|
-
```javascript
|
|
248
|
-
{
|
|
249
|
-
name: "get_view_records",
|
|
250
|
-
params: {
|
|
251
|
-
table: "string",
|
|
252
|
-
view: "string"
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### 🎨 Priority 8: Attachments & Media
|
|
258
|
-
|
|
259
|
-
#### 19. **upload_attachment**
|
|
260
|
-
Upload files to attachment fields
|
|
261
|
-
```javascript
|
|
262
|
-
{
|
|
263
|
-
name: "upload_attachment",
|
|
264
|
-
params: {
|
|
265
|
-
table: "string",
|
|
266
|
-
recordId: "string",
|
|
267
|
-
field: "string",
|
|
268
|
-
fileUrl: "string|base64"
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
#### 20. **get_attachments**
|
|
274
|
-
Download attachments from records
|
|
275
|
-
```javascript
|
|
276
|
-
{
|
|
277
|
-
name: "get_attachments",
|
|
278
|
-
params: {
|
|
279
|
-
table: "string",
|
|
280
|
-
recordId: "string",
|
|
281
|
-
field: "string"
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
## Implementation Roadmap
|
|
287
|
-
|
|
288
|
-
### Phase 1 (Version 1.3.0) - Essential CRUD
|
|
289
|
-
- ✅ create_record
|
|
290
|
-
- ✅ update_record
|
|
291
|
-
- ✅ delete_record
|
|
292
|
-
- ✅ get_record_by_id
|
|
293
|
-
- ✅ search_records
|
|
294
|
-
|
|
295
|
-
### Phase 2 (Version 1.4.0) - Batch & Schema
|
|
296
|
-
- batch_operations
|
|
297
|
-
- get_table_schema
|
|
298
|
-
- export_table
|
|
299
|
-
- import_data
|
|
300
|
-
|
|
301
|
-
### Phase 3 (Version 1.5.0) - Advanced Features
|
|
302
|
-
- create_table
|
|
303
|
-
- create_field
|
|
304
|
-
- link_records
|
|
305
|
-
- get_linked_records
|
|
306
|
-
|
|
307
|
-
### Phase 4 (Version 2.0.0) - Enterprise Features
|
|
308
|
-
- aggregate_data
|
|
309
|
-
- Views management
|
|
310
|
-
- Attachments handling
|
|
311
|
-
- Webhooks support
|
|
312
|
-
|
|
313
|
-
## Technical Considerations
|
|
314
|
-
|
|
315
|
-
### Rate Limiting
|
|
316
|
-
- Implement request queuing to respect 5 req/sec limit
|
|
317
|
-
- Add retry logic with exponential backoff
|
|
318
|
-
- Cache frequently accessed data
|
|
319
|
-
|
|
320
|
-
### Error Handling
|
|
321
|
-
- Detailed error messages for debugging
|
|
322
|
-
- Graceful fallbacks for missing permissions
|
|
323
|
-
- Validation of input parameters
|
|
324
|
-
|
|
325
|
-
### Performance
|
|
326
|
-
- Implement pagination for large datasets
|
|
327
|
-
- Add optional field filtering to reduce payload
|
|
328
|
-
- Support streaming for large exports
|
|
329
|
-
|
|
330
|
-
### Security
|
|
331
|
-
- Validate all input to prevent injection
|
|
332
|
-
- Support field-level permissions
|
|
333
|
-
- Add optional audit logging
|
|
334
|
-
|
|
335
|
-
## Usage Examples
|
|
336
|
-
|
|
337
|
-
### Creating a Record
|
|
338
|
-
```
|
|
339
|
-
"Create a new task in the Tasks table with title 'Review proposal' and status 'In Progress'"
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
### Complex Search
|
|
343
|
-
```
|
|
344
|
-
"Find all high-priority tasks assigned to John that are due this week"
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### Bulk Operations
|
|
348
|
-
```
|
|
349
|
-
"Mark all tasks with status 'Done' as archived"
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### Data Export
|
|
353
|
-
```
|
|
354
|
-
"Export the entire Customers table as a CSV file"
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
## Benefits
|
|
358
|
-
|
|
359
|
-
1. **Complete Functionality**: Full CRUD operations matching Airtable's capabilities
|
|
360
|
-
2. **Natural Language**: All operations accessible through conversational AI
|
|
361
|
-
3. **Productivity**: Batch operations and data import/export save time
|
|
362
|
-
4. **Flexibility**: Support for complex queries and relationships
|
|
363
|
-
5. **Enterprise Ready**: Schema management and analytics features
|
|
364
|
-
|
|
365
|
-
## Next Steps
|
|
366
|
-
|
|
367
|
-
1. Prioritize features based on user needs
|
|
368
|
-
2. Implement Phase 1 features (essential CRUD)
|
|
369
|
-
3. Add comprehensive testing for each new tool
|
|
370
|
-
4. Update documentation with examples
|
|
371
|
-
5. Gather user feedback for Phase 2 planning
|
package/INSTALLATION.md
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# Installation
|
|
2
|
-
|
|
3
|
-
Airtable MCP embeds Airtable database connectivity directly into your AI-powered code editor
|
|
4
|
-
|
|
5
|
-
## Getting Started
|
|
6
|
-
|
|
7
|
-
Built by Rashid Azarang,
|
|
8
|
-
|
|
9
|
-
Airtable MCP gives AI code editors and agents the ability to access and manipulate your Airtable databases for powerful data management capabilities - all in a secure manner with your own API tokens.
|
|
10
|
-
|
|
11
|
-
With this MCP server tool, you can enable AI code editors and agents to have access to:
|
|
12
|
-
|
|
13
|
-
* List and access all your Airtable bases
|
|
14
|
-
* Browse tables, fields, and record data
|
|
15
|
-
* Create, read, update, and delete records
|
|
16
|
-
* Export and manipulate schemas
|
|
17
|
-
* Perform complex queries against your data
|
|
18
|
-
* Create data migration mappings
|
|
19
|
-
* Analyze and transform your Airtable data
|
|
20
|
-
|
|
21
|
-
That way, you can simply tell Cursor or any AI code editor with MCP integrations:
|
|
22
|
-
|
|
23
|
-
"Show me all the tables in my Airtable base"
|
|
24
|
-
|
|
25
|
-
"Find all records from the Customers table where the status is Active and the last purchase was after January 1st"
|
|
26
|
-
|
|
27
|
-
"Create a new record in the Products table with these fields..."
|
|
28
|
-
|
|
29
|
-
"Export the schema of my current Airtable base"
|
|
30
|
-
|
|
31
|
-
"Help me create a mapping between these two tables for data migration"
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Requirements
|
|
36
|
-
|
|
37
|
-
* Node.js 14+ installed on your machine
|
|
38
|
-
* Python 3.10+ installed on your machine (automatically detected)
|
|
39
|
-
* Airtable Personal Access Token (API Key)
|
|
40
|
-
* MCP Client Application (Cursor, Claude Desktop, Cline, Zed, etc.)
|
|
41
|
-
|
|
42
|
-
**Note**: Model Context Protocol (MCP) is specific to Anthropic models. When using an editor like Cursor, make sure to enable composer agent with Claude 3.5 Sonnet selected as the model.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Installation
|
|
47
|
-
|
|
48
|
-
### 1. Install via Smithery (Easiest)
|
|
49
|
-
|
|
50
|
-
The easiest way to install Airtable MCP is through Smithery:
|
|
51
|
-
|
|
52
|
-
1. Visit [Smithery](https://smithery.ai)
|
|
53
|
-
2. Search for "@rashidazarang/airtable-mcp"
|
|
54
|
-
3. Click "Install" and follow the prompts to configure with your Airtable token and base ID
|
|
55
|
-
|
|
56
|
-
### 2. Install via NPX (Alternative)
|
|
57
|
-
|
|
58
|
-
Another simple way to install and use Airtable MCP is via NPX:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
# Install globally
|
|
62
|
-
npm install -g airtable-mcp
|
|
63
|
-
|
|
64
|
-
# Or use directly with npx (no installation needed)
|
|
65
|
-
npx airtable-mcp --token YOUR_AIRTABLE_TOKEN --base YOUR_BASE_ID
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 3. Get Your Airtable API Token
|
|
69
|
-
|
|
70
|
-
1. Log in to your Airtable account
|
|
71
|
-
2. Go to your [Account Settings](https://airtable.com/account)
|
|
72
|
-
3. Navigate to the "API" section
|
|
73
|
-
4. Create a Personal Access Token with appropriate permissions
|
|
74
|
-
5. Copy your token to use in the configuration
|
|
75
|
-
|
|
76
|
-
### 4. Configure Your MCP Client
|
|
77
|
-
|
|
78
|
-
#### For Cursor:
|
|
79
|
-
|
|
80
|
-
1. Go to Cursor Settings
|
|
81
|
-
2. Navigate to Features, scroll down to MCP Servers and click "Add new MCP server"
|
|
82
|
-
3. Give it a unique name (airtable-tools), set type to "command" and set the command to:
|
|
83
|
-
|
|
84
|
-
**For macOS/Linux/Windows:**
|
|
85
|
-
```bash
|
|
86
|
-
npx airtable-mcp --token YOUR_AIRTABLE_TOKEN --base YOUR_BASE_ID
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Replace `YOUR_AIRTABLE_TOKEN` with your Airtable Personal Access Token and `YOUR_BASE_ID` with your default Airtable base ID (optional).
|
|
90
|
-
|
|
91
|
-
#### For Advanced Users via ~/.cursor/mcp.json:
|
|
92
|
-
|
|
93
|
-
Edit your `~/.cursor/mcp.json` file to include:
|
|
94
|
-
|
|
95
|
-
```json
|
|
96
|
-
{
|
|
97
|
-
"mcpServers": {
|
|
98
|
-
"airtable-tools": {
|
|
99
|
-
"command": "npx",
|
|
100
|
-
"args": [
|
|
101
|
-
"airtable-mcp",
|
|
102
|
-
"--token", "YOUR_AIRTABLE_TOKEN",
|
|
103
|
-
"--base", "YOUR_BASE_ID"
|
|
104
|
-
]
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 5. Verify Connection
|
|
111
|
-
|
|
112
|
-
1. Restart your MCP client (Cursor, etc.)
|
|
113
|
-
2. Create a new query using the Composer Agent with Claude 3.5 Sonnet model
|
|
114
|
-
3. Ask something like "List my Airtable bases" or "Show me the tables in my current base"
|
|
115
|
-
4. You should see a response with your Airtable data
|
|
116
|
-
|
|
117
|
-
### 6. For Production Use (Optional)
|
|
118
|
-
|
|
119
|
-
For continuous availability, you can set up Airtable MCP using PM2:
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
# Install PM2 if you don't have it
|
|
123
|
-
npm install -g pm2
|
|
124
|
-
|
|
125
|
-
# Create a PM2 config file
|
|
126
|
-
echo 'module.exports = {
|
|
127
|
-
apps: [
|
|
128
|
-
{
|
|
129
|
-
name: "airtable-mcp",
|
|
130
|
-
script: "npx",
|
|
131
|
-
args: [
|
|
132
|
-
"airtable-mcp",
|
|
133
|
-
"--token", "YOUR_AIRTABLE_TOKEN",
|
|
134
|
-
"--base", "YOUR_BASE_ID"
|
|
135
|
-
],
|
|
136
|
-
env: {
|
|
137
|
-
PATH: process.env.PATH,
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
};' > ecosystem.config.js
|
|
142
|
-
|
|
143
|
-
# Start the process
|
|
144
|
-
pm2 start ecosystem.config.js
|
|
145
|
-
|
|
146
|
-
# Set it to start on boot
|
|
147
|
-
pm2 startup
|
|
148
|
-
pm2 save
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Troubleshooting
|
|
154
|
-
|
|
155
|
-
Here are some common issues and their solutions:
|
|
156
|
-
|
|
157
|
-
### Error: Unable to connect to Airtable API
|
|
158
|
-
|
|
159
|
-
- Double-check your Airtable API token is correct and has sufficient permissions
|
|
160
|
-
- Verify your internet connection
|
|
161
|
-
- Check if Airtable API is experiencing downtime
|
|
162
|
-
|
|
163
|
-
### Issue: MCP server not connecting
|
|
164
|
-
|
|
165
|
-
- Make sure Node.js 14+ and Python 3.10+ are installed and in your PATH
|
|
166
|
-
- Try specifying a specific version: `npx airtable-mcp@latest`
|
|
167
|
-
- Check the Cursor logs for any connection errors
|
|
168
|
-
|
|
169
|
-
### Error: Base not found
|
|
170
|
-
|
|
171
|
-
- Verify your base ID is correct
|
|
172
|
-
- Make sure your API token has access to the specified base
|
|
173
|
-
- Try listing all bases first to confirm access
|
|
174
|
-
|
|
175
|
-
### Issue: Permission denied errors
|
|
176
|
-
|
|
177
|
-
- Make sure your token has the necessary permissions for the operations you're trying to perform
|
|
178
|
-
- Check if you're attempting operations on tables/bases that your token doesn't have access to
|
|
179
|
-
|
|
180
|
-
### For more help
|
|
181
|
-
|
|
182
|
-
- Open an issue on the [GitHub repository](https://github.com/rashidazarang/airtable-mcp/issues)
|
|
183
|
-
- Check the Airtable API documentation for any API-specific errors
|