#
tokens: 49377/50000 60/81 files (page 1/5)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 1 of 5. Use http://codebase.md/rashidazarang/airtable-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .eslintrc.js
├── .github
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.md
│   │   ├── custom.md
│   │   └── feature_request.md
│   └── pull_request_template.md
├── .gitignore
├── .nvmrc
├── .prettierrc
├── bin
│   ├── airtable-crud-cli.js
│   └── airtable-mcp.js
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── docker
│   ├── Dockerfile
│   └── Dockerfile.node
├── docs
│   ├── guides
│   │   ├── CLAUDE_INTEGRATION.md
│   │   ├── ENHANCED_FEATURES.md
│   │   ├── INSTALLATION.md
│   │   └── QUICK_START.md
│   └── releases
│       ├── RELEASE_NOTES_v1.2.2.md
│       ├── RELEASE_NOTES_v1.2.4.md
│       ├── RELEASE_NOTES_v1.4.0.md
│       ├── RELEASE_NOTES_v1.5.0.md
│       └── RELEASE_NOTES_v1.6.0.md
├── examples
│   ├── airtable-crud-example.js
│   ├── building-mcp.md
│   ├── claude_config.json
│   ├── claude_simple_config.json
│   ├── env-demo.js
│   ├── example_usage.md
│   ├── example-tasks-update.json
│   ├── example-tasks.json
│   ├── python_debug_patch.txt
│   ├── sample-transform.js
│   ├── typescript
│   │   ├── advanced-ai-prompts.ts
│   │   ├── basic-usage.ts
│   │   └── claude-desktop-config.json
│   └── windsurf_mcp_config.json
├── index.js
├── ISSUE_RESPONSES.md
├── jest.config.js
├── LICENSE
├── package-lock.json
├── package.json
├── PROJECT_STRUCTURE.md
├── README.md
├── RELEASE_SUMMARY_v3.2.x.md
├── RELEASE_v3.2.1.md
├── RELEASE_v3.2.3.md
├── RELEASE_v3.2.4.md
├── requirements.txt
├── SECURITY_NOTICE.md
├── smithery.yaml
├── src
│   ├── index.js
│   ├── javascript
│   │   ├── airtable_simple_production.js
│   │   └── airtable_simple.js
│   ├── python
│   │   ├── airtable_mcp
│   │   │   ├── __init__.py
│   │   │   └── src
│   │   │       └── server.py
│   │   ├── inspector_server.py
│   │   ├── inspector.py
│   │   ├── setup.py
│   │   ├── simple_airtable_server.py
│   │   └── test_client.py
│   └── typescript
│       ├── ai-prompts.d.ts
│       ├── airtable-mcp-server.d.ts
│       ├── airtable-mcp-server.ts
│       ├── errors.ts
│       ├── index.d.ts
│       ├── prompt-templates.ts
│       ├── test-suite.d.ts
│       ├── test-suite.ts
│       ├── tools-schemas.ts
│       └── tools.d.ts
├── TESTING_REPORT.md
├── tests
│   ├── test_all_features.sh
│   ├── test_mcp_comprehensive.js
│   ├── test_v1.5.0_final.sh
│   └── test_v1.6.0_comprehensive.sh
├── tsconfig.json
└── types
    └── typescript
        ├── airtable-mcp-server.d.ts
        ├── errors.d.ts
        ├── prompt-templates.d.ts
        ├── test-suite.d.ts
        └── tools-schemas.d.ts
```

# Files

--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------

```
1 | 18.18.0
```

--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------

```
 1 | {
 2 |   "semi": true,
 3 |   "trailingComma": "es5",
 4 |   "singleQuote": true,
 5 |   "printWidth": 100,
 6 |   "tabWidth": 2,
 7 |   "useTabs": false,
 8 |   "bracketSpacing": true,
 9 |   "arrowParens": "always",
10 |   "endOfLine": "lf",
11 |   "overrides": [
12 |     {
13 |       "files": "*.md",
14 |       "options": {
15 |         "proseWrap": "always"
16 |       }
17 |     },
18 |     {
19 |       "files": "*.json",
20 |       "options": {
21 |         "printWidth": 80
22 |       }
23 |     }
24 |   ]
25 | }
```

--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------

```javascript
 1 | module.exports = {
 2 |   root: true,
 3 |   parser: '@typescript-eslint/parser',
 4 |   parserOptions: {
 5 |     ecmaVersion: 2022,
 6 |     sourceType: 'module',
 7 |     project: './tsconfig.json',
 8 |   },
 9 |   env: {
10 |     node: true,
11 |     es2022: true,
12 |     jest: true,
13 |   },
14 |   extends: [
15 |     'eslint:recommended',
16 |     'plugin:@typescript-eslint/recommended',
17 |     'plugin:@typescript-eslint/recommended-requiring-type-checking',
18 |     'prettier',
19 |   ],
20 |   plugins: ['@typescript-eslint'],
21 |   ignorePatterns: ['dist/', 'node_modules/', '*.js'],
22 |   rules: {
23 |     // TypeScript specific rules
24 |     '@typescript-eslint/explicit-function-return-type': 'warn',
25 |     '@typescript-eslint/no-explicit-any': 'warn',
26 |     '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
27 |     '@typescript-eslint/no-non-null-assertion': 'warn',
28 |     
29 |     // General rules
30 |     'no-console': ['warn', { allow: ['warn', 'error'] }],
31 |     'prefer-const': 'error',
32 |     'no-var': 'error',
33 |     'object-shorthand': 'error',
34 |     'prefer-template': 'error',
35 |     
36 |     // Code quality
37 |     complexity: ['warn', 10],
38 |     'max-lines': ['warn', 500],
39 |     'max-depth': ['warn', 4],
40 |   },
41 |   overrides: [
42 |     {
43 |       files: ['*.js'],
44 |       parser: 'espree',
45 |       parserOptions: {
46 |         ecmaVersion: 2022,
47 |       },
48 |       extends: ['eslint:recommended'],
49 |       rules: {
50 |         'no-console': 'off',
51 |       },
52 |     },
53 |     {
54 |       files: ['tests/**/*.{js,ts}'],
55 |       rules: {
56 |         '@typescript-eslint/no-explicit-any': 'off',
57 |         'no-console': 'off',
58 |       },
59 |     },
60 |   ],
61 | };
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
  1 | # Python
  2 | __pycache__/
  3 | *.py[cod]
  4 | *$py.class
  5 | *.so
  6 | .Python
  7 | build/
  8 | develop-eggs/
  9 | dist/
 10 | downloads/
 11 | eggs/
 12 | .eggs/
 13 | lib/
 14 | lib64/
 15 | parts/
 16 | sdist/
 17 | var/
 18 | wheels/
 19 | *.egg-info/
 20 | .installed.cfg
 21 | *.egg
 22 | MANIFEST
 23 | 
 24 | # Virtual environments
 25 | .env
 26 | .venv
 27 | env/
 28 | venv/
 29 | ENV/
 30 | env.bak/
 31 | venv.bak/
 32 | 
 33 | # Node.js
 34 | node_modules/
 35 | npm-debug.log
 36 | yarn-debug.log
 37 | yarn-error.log
 38 | lerna-debug.log
 39 | .pnpm-debug.log
 40 | .npm
 41 | .yarn/cache
 42 | .yarn/unplugged
 43 | .yarn/build-state.yml
 44 | .yarn/install-state.gz
 45 | .pnp.*
 46 | 
 47 | # Logs
 48 | logs
 49 | *.log
 50 | 
 51 | # OS specific
 52 | .DS_Store
 53 | .AppleDouble
 54 | .LSOverride
 55 | Thumbs.db
 56 | ehthumbs.db
 57 | Desktop.ini
 58 | 
 59 | # IDEs and editors
 60 | .idea/
 61 | .vscode/*
 62 | !.vscode/settings.json
 63 | !.vscode/tasks.json
 64 | !.vscode/launch.json
 65 | !.vscode/extensions.json
 66 | *.sublime-project
 67 | *.sublime-workspace
 68 | 
 69 | # Personal tokens and secrets
 70 | *.pem
 71 | *.key
 72 | *.env
 73 | secrets.json
 74 | 
 75 | # Local
 76 | temp/
 77 | tmp/
 78 | .cache/
 79 | 
 80 | # Runtime data
 81 | *.pid
 82 | *.seed
 83 | *.pid.lock
 84 | 
 85 | # Environment variables
 86 | .env.*
 87 | 
 88 | # AI Agent Project (new subdirectory)
 89 | /ai-agent/
 90 | 
 91 | # Test artifacts and temporary files
 92 | /test-clone/
 93 | *.tmp
 94 | *.temp
 95 | 
 96 | # Development artifacts
 97 | /airtable_simple_v*.js
 98 | /airtable_enhanced.js
 99 | /airtable_v*.js
100 | *.backup.js
101 | 
102 | # Development versions and test files
103 | /airtable_mcp_v2.js
104 | /airtable_mcp_v2_oauth.js
105 | /airtable_mcp_v3_advanced.js
106 | /test_*.js
107 | /test_*.sh
108 | /quick_test.sh
109 | /cleanup.sh
110 | /publish-steps.txt
111 | 
112 | # Development documentation
113 | /DEVELOPMENT.md
114 | /IMPROVEMENT_PROPOSAL.md
115 | /MCP_REVIEW_SUMMARY.md
116 | /CAPABILITY_REPORT.md
117 | /API_DOCUMENTATION.md
118 | /RELEASE_NOTES_*.md
119 | 
120 | # Infrastructure files (keep for reference but not in main package)
121 | /helm/
122 | /k8s/
123 | /monitoring/
124 | /docker-compose.production.yml
125 | /Dockerfile.production
126 | /.github/workflows/
127 | /.github/ISSUE_TEMPLATE/
128 | 
129 | # Chrome extension development
130 | /airtable-clipper/
131 | 
132 | # Package artifacts
133 | *.tgz
134 | /rashidazarang-airtable-mcp-*.tgz
135 | 
136 | # Claude Code artifacts
137 | /.claude/
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Airtable MCP Server
  2 | 
  3 | [![Trust Score](https://archestra.ai/mcp-catalog/api/badge/quality/rashidazarang/airtable-mcp)](https://archestra.ai/mcp-catalog/rashidazarang__airtable-mcp)
  4 | [![smithery badge](https://smithery.ai/badge/@rashidazarang/airtable-mcp)](https://smithery.ai/server/@rashidazarang/airtable-mcp)
  5 | ![Airtable](https://img.shields.io/badge/Airtable-18BFFF?style=for-the-badge&logo=Airtable&logoColor=white)
  6 | [![MCP](https://img.shields.io/badge/MCP-3.2.4-blue)](https://github.com/rashidazarang/airtable-mcp)
  7 | [![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue)](https://www.typescriptlang.org/)
  8 | [![AI Agent](https://img.shields.io/badge/AI_Agent-Enhanced-purple)](https://github.com/rashidazarang/airtable-mcp)
  9 | [![Security](https://img.shields.io/badge/Security-Enterprise-green)](https://github.com/rashidazarang/airtable-mcp)
 10 | [![Protocol](https://img.shields.io/badge/Protocol-2024--11--05-success)](https://modelcontextprotocol.io/)
 11 | 
 12 | 🤖 **Revolutionary AI Agent v3.2.4** - Advanced AI-powered Airtable MCP server with **fixed TypeScript architecture**, world-class project organization, comprehensive intelligence capabilities, predictive analytics, and enterprise automation features.
 13 | 
 14 | ## 🚀 Latest: v3.2.4 - XSS Security Fix & Complete Protection
 15 | 
 16 | **Major Improvements** with full backward compatibility:
 17 | - 🔧 **TypeScript Architecture Fixed** - Resolved compilation issues, proper separation of types and runtime code
 18 | - 📁 **World-Class Organization** - Restructured project with src/typescript, src/javascript, src/python
 19 | - 🔒 **Security Fix Complete** - Fully resolved command injection vulnerability with comprehensive validation
 20 | - 🔷 **TypeScript Implementation** - Complete type-safe server with strict validation
 21 | - 📘 **Comprehensive Type Definitions** - All 33 tools and 10 AI prompts fully typed
 22 | - 🛡️ **Compile-Time Safety** - Catch errors before runtime with advanced type checking
 23 | - 🎯 **Developer Experience** - IntelliSense, auto-completion, and refactoring support
 24 | - 🔄 **Dual Distribution** - Use with JavaScript or TypeScript, your choice
 25 | 
 26 | ## 🤖 AI Intelligence Suite
 27 | 
 28 | **Complete AI-Powered Intelligence** with enterprise capabilities:
 29 | - 🤖 **10 AI Prompt Templates** - Advanced analytics, predictions, and automation
 30 | - 🔮 **Predictive Analytics** - Forecasting and trend analysis with confidence intervals
 31 | - 🗣️ **Natural Language Processing** - Query your data using human language
 32 | - 📊 **Business Intelligence** - Automated insights and recommendations
 33 | - 🏗️ **Smart Schema Design** - AI-optimized database architecture
 34 | - ⚡ **Workflow Automation** - Intelligent process optimization
 35 | - 🔍 **Data Quality Auditing** - Comprehensive quality assessment and fixes
 36 | - 📈 **Statistical Analysis** - Advanced analytics with significance testing
 37 | 
 38 | ## ✨ Features
 39 | 
 40 | - 🔍 **Natural Language Queries** - Ask questions about your data in plain English
 41 | - 📊 **Full CRUD Operations** - Create, read, update, and delete records
 42 | - 🪝 **Webhook Management** - Create and manage webhooks for real-time notifications
 43 | - 🏗️ **Advanced Schema Management** - Create tables, fields, and manage base structure
 44 | - 🔍 **Base Discovery** - Explore all accessible bases and their schemas
 45 | - 🔧 **Field Management** - Add, modify, and remove fields programmatically
 46 | - 🔐 **Secure Authentication** - Uses environment variables for credentials
 47 | - 🚀 **Easy Setup** - Multiple installation options available
 48 | - ⚡ **Fast & Reliable** - Built with Node.js for optimal performance
 49 | - 🎯 **33 Powerful Tools** - Complete Airtable API coverage with batch operations
 50 | - 📎 **Attachment Management** - Upload files via URLs to attachment fields
 51 | - ⚡ **Batch Operations** - Create, update, delete up to 10 records at once
 52 | - 👥 **Collaboration Tools** - Manage base collaborators and shared views
 53 | - 🤖 **AI Integration** - Prompts and sampling for intelligent data operations
 54 | - 🔐 **Enterprise Security** - OAuth2, rate limiting, comprehensive validation
 55 | 
 56 | ## 📋 Prerequisites
 57 | 
 58 | - Node.js 14+ installed on your system
 59 | - An Airtable account with a Personal Access Token
 60 | - Your Airtable Base ID
 61 | 
 62 | ## 🚀 Quick Start
 63 | 
 64 | ### Step 1: Get Your Airtable Credentials
 65 | 
 66 | 1. **Personal Access Token**: Visit [Airtable Account](https://airtable.com/account) → Create a token with the following scopes:
 67 |    - `data.records:read` - Read records from tables
 68 |    - `data.records:write` - Create, update, delete records
 69 |    - `schema.bases:read` - View table schemas
 70 |    - `schema.bases:write` - **New in v1.5.0** - Create/modify tables and fields
 71 |    - `webhook:manage` - (Optional) For webhook features
 72 | 
 73 | 2. **Base ID**: Open your Airtable base and copy the ID from the URL:
 74 |    ```
 75 |    https://airtable.com/[BASE_ID]/...
 76 |    ```
 77 | 
 78 | ### Step 2: Installation
 79 | 
 80 | Choose one of these installation methods:
 81 | 
 82 | #### 🔷 TypeScript Users (Recommended for Development)
 83 | 
 84 | ```bash
 85 | # Install with TypeScript support
 86 | npm install -g @rashidazarang/airtable-mcp
 87 | 
 88 | # For development with types
 89 | npm install --save-dev typescript @types/node
 90 | ```
 91 | 
 92 | #### 📦 JavaScript Users (Production Ready)
 93 | 
 94 | **Option A: Install via NPM (Recommended)**
 95 | 
 96 | ```bash
 97 | npm install -g @rashidazarang/airtable-mcp
 98 | ```
 99 | 
100 | **Option B: Clone from GitHub**
101 | 
102 | ```bash
103 | git clone https://github.com/rashidazarang/airtable-mcp.git
104 | cd airtable-mcp
105 | npm install
106 | ```
107 | 
108 | ### Step 3: Set Up Environment Variables
109 | 
110 | Create a `.env` file in your project directory:
111 | 
112 | ```env
113 | AIRTABLE_TOKEN=your_personal_access_token_here
114 | AIRTABLE_BASE_ID=your_base_id_here
115 | ```
116 | 
117 | **Security Note**: Never commit `.env` files to version control!
118 | 
119 | ### Step 4: Configure Your MCP Client
120 | 
121 | #### 🔷 TypeScript Configuration (Enhanced Developer Experience)
122 | 
123 | Add to your Claude Desktop configuration file with TypeScript binary:
124 | 
125 | **MacOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
126 | **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`
127 | 
128 | ```json
129 | {
130 |   "mcpServers": {
131 |     "airtable-typescript": {
132 |       "command": "npx",
133 |       "args": [
134 |         "@rashidazarang/airtable-mcp",
135 |         "--token",
136 |         "YOUR_AIRTABLE_TOKEN",
137 |         "--base",
138 |         "YOUR_BASE_ID"
139 |       ],
140 |       "env": {
141 |         "NODE_ENV": "production",
142 |         "LOG_LEVEL": "INFO"
143 |       }
144 |     }
145 |   }
146 | }
147 | ```
148 | 
149 | #### 📦 JavaScript Configuration (Standard)
150 | 
151 | Add to your Claude Desktop configuration file:
152 | 
153 | **MacOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
154 | **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
155 | 
156 | ```json
157 | {
158 |   "mcpServers": {
159 |     "airtable": {
160 |       "command": "npx",
161 |       "args": [
162 |         "@rashidazarang/airtable-mcp",
163 |         "--token",
164 |         "YOUR_AIRTABLE_TOKEN",
165 |         "--base",
166 |         "YOUR_BASE_ID"
167 |       ]
168 |     }
169 |   }
170 | }
171 | ```
172 | 
173 | #### For Environment Variables (More Secure)
174 | 
175 | ```json
176 | {
177 |   "mcpServers": {
178 |     "airtable": {
179 |       "command": "npx",
180 |       "args": ["@rashidazarang/airtable-mcp"],
181 |       "env": {
182 |         "AIRTABLE_TOKEN": "YOUR_AIRTABLE_TOKEN",
183 |         "AIRTABLE_BASE_ID": "YOUR_BASE_ID"
184 |       }
185 |     }
186 |   }
187 | }
188 | ```
189 | 
190 | ### Step 5: Restart Your MCP Client
191 | 
192 | After configuration, restart Claude Desktop or your MCP client to load the Airtable server.
193 | 
194 | ## 🎯 Usage Examples
195 | 
196 | Once configured, you can interact with your Airtable data naturally:
197 | 
198 | ### 🔷 TypeScript Development
199 | 
200 | ```typescript
201 | import { 
202 |   AirtableMCPServer, 
203 |   ListRecordsInput, 
204 |   AnalyzeDataPrompt 
205 | } from '@rashidazarang/airtable-mcp/types';
206 | 
207 | const server = new AirtableMCPServer();
208 | 
209 | // Type-safe data operations
210 | const params: ListRecordsInput = {
211 |   table: 'Tasks',
212 |   maxRecords: 10,
213 |   filterByFormula: "Status = 'Active'"
214 | };
215 | 
216 | const records = await server.handleToolCall('list_records', params);
217 | 
218 | // Type-safe AI analytics
219 | const analysis: AnalyzeDataPrompt = {
220 |   table: 'Sales',
221 |   analysis_type: 'predictive',
222 |   confidence_level: 0.95
223 | };
224 | 
225 | const insights = await server.handlePromptGet('analyze_data', analysis);
226 | ```
227 | 
228 | ### 📦 Natural Language Interactions
229 | 
230 | **Basic Operations**
231 | ```
232 | "Show me all records in the Projects table"
233 | "Create a new task with priority 'High' and due date tomorrow"
234 | "Update the status of task ID rec123 to 'Completed'"
235 | "Delete all records where status is 'Archived'"
236 | "What tables are in my base?"
237 | "Search for records where Status equals 'Active'"
238 | ```
239 | 
240 | **Webhook Operations (v1.4.0+)**
241 | ```
242 | "Create a webhook for my table that notifies https://my-app.com/webhook"
243 | "List all active webhooks in my base"
244 | "Show me the recent webhook payloads"
245 | "Delete webhook ach123xyz"
246 | ```
247 | 
248 | **Schema Management (v1.5.0+)**
249 | ```
250 | "List all my accessible Airtable bases"
251 | "Show me the complete schema for this base"
252 | "Describe the Projects table with all field details"
253 | "Create a new table called 'Tasks' with Name, Priority, and Due Date fields"
254 | "Add a Status field to the existing Projects table"
255 | "What field types are available in Airtable?"
256 | ```
257 | 
258 | **Batch Operations & Attachments (v1.6.0+)**
259 | ```
260 | "Create 5 new records at once in the Tasks table"
261 | "Update multiple records with new status values"
262 | "Delete these 3 records in one operation"
263 | "Attach this image URL to the record's photo field"
264 | "Who are the collaborators on this base?"
265 | "Show me all shared views in this base"
266 | ```
267 | 
268 | ## 🛠️ Available Tools (33 Total)
269 | 
270 | ### 📊 Data Operations (7 tools)
271 | | Tool | Description |
272 | |------|-------------|
273 | | `list_tables` | Get all tables in your base with schema information |
274 | | `list_records` | Query records with optional filtering and pagination |
275 | | `get_record` | Retrieve a single record by ID |
276 | | `create_record` | Add new records to any table |
277 | | `update_record` | Modify existing record fields |
278 | | `delete_record` | Remove records from a table |
279 | | `search_records` | Advanced search with Airtable formulas and sorting |
280 | 
281 | ### 🪝 Webhook Management (5 tools)
282 | | Tool | Description |
283 | |------|-------------|
284 | | `list_webhooks` | View all webhooks configured for your base |
285 | | `create_webhook` | Set up real-time notifications for data changes |
286 | | `delete_webhook` | Remove webhook configurations |
287 | | `get_webhook_payloads` | Retrieve webhook notification history |
288 | | `refresh_webhook` | Extend webhook expiration time |
289 | 
290 | ### 🔍 Schema Discovery (6 tools) - **New in v1.5.0**
291 | | Tool | Description |
292 | |------|-------------|
293 | | `list_bases` | List all accessible Airtable bases with permissions |
294 | | `get_base_schema` | Get complete schema information for any base |
295 | | `describe_table` | Get detailed table info including all field specifications |
296 | | `list_field_types` | Reference guide for all available Airtable field types |
297 | | `get_table_views` | List all views for a specific table with configurations |
298 | 
299 | ### 🏗️ Table Management (3 tools) - **New in v1.5.0**
300 | | Tool | Description |
301 | |------|-------------|
302 | | `create_table` | Create new tables with custom field definitions |
303 | | `update_table` | Modify table names and descriptions |
304 | | `delete_table` | Remove tables (with safety confirmation required) |
305 | 
306 | ### 🔧 Field Management (3 tools) - **New in v1.5.0**
307 | | Tool | Description |
308 | |------|-------------|
309 | | `create_field` | Add new fields to existing tables with all field types |
310 | | `update_field` | Modify field properties, names, and options |
311 | | `delete_field` | Remove fields (with safety confirmation required) |
312 | 
313 | ### ⚡ Batch Operations (4 tools) - **New in v1.6.0**
314 | | Tool | Description |
315 | |------|-------------|
316 | | `batch_create_records` | Create up to 10 records at once for better performance |
317 | | `batch_update_records` | Update up to 10 records simultaneously |
318 | | `batch_delete_records` | Delete up to 10 records in a single operation |
319 | | `batch_upsert_records` | Update existing or create new records based on key fields |
320 | 
321 | ### 📎 Attachment Management (1 tool) - **New in v1.6.0**
322 | | Tool | Description |
323 | |------|-------------|
324 | | `upload_attachment` | Attach files from public URLs to attachment fields |
325 | 
326 | ### 👁️ Advanced Views (2 tools) - **New in v1.6.0**
327 | | Tool | Description |
328 | |------|-------------|
329 | | `create_view` | Create new views (grid, form, calendar, etc.) with custom configurations |
330 | | `get_view_metadata` | Get detailed view information including filters and sorts |
331 | 
332 | ### 🏢 Base Management (3 tools) - **New in v1.6.0**
333 | | Tool | Description |
334 | |------|-------------|
335 | | `create_base` | Create new Airtable bases with initial table structures |
336 | | `list_collaborators` | View base collaborators and their permission levels |
337 | | `list_shares` | List shared views and their public configurations |
338 | 
339 | ### 🤖 AI Intelligence Suite (10 prompts) - **New in v3.0.0**
340 | | Prompt | Description | Enterprise Features |
341 | |--------|-------------|-------------------|
342 | | `analyze_data` | Advanced statistical analysis with ML insights | Confidence intervals, anomaly detection |
343 | | `create_report` | Intelligent report generation with recommendations | Multi-stakeholder customization, ROI analysis |
344 | | `data_insights` | Business intelligence and pattern discovery | Cross-table correlations, predictive indicators |
345 | | `optimize_workflow` | AI-powered automation recommendations | Change management, implementation roadmaps |
346 | | `smart_schema_design` | Database optimization with best practices | Compliance-aware (GDPR, HIPAA), scalability planning |
347 | | `data_quality_audit` | Comprehensive quality assessment and fixes | Automated remediation, governance frameworks |
348 | | `predictive_analytics` | Forecasting and trend prediction | Multiple algorithms, uncertainty quantification |
349 | | `natural_language_query` | Process human questions intelligently | Context awareness, confidence scoring |
350 | | `smart_data_transformation` | AI-assisted data processing | Quality rules, audit trails, optimization |
351 | | `automation_recommendations` | Workflow optimization suggestions | Technical feasibility, cost-benefit analysis |
352 | 
353 | ## 🔧 Advanced Configuration
354 | 
355 | ### Using with Smithery Cloud
356 | 
357 | For cloud-hosted MCP servers:
358 | 
359 | ```json
360 | {
361 |   "mcpServers": {
362 |     "airtable": {
363 |       "command": "npx",
364 |       "args": [
365 |         "@smithery/cli",
366 |         "run",
367 |         "@rashidazarang/airtable-mcp",
368 |         "--token",
369 |         "YOUR_TOKEN",
370 |         "--base",
371 |         "YOUR_BASE_ID"
372 |       ]
373 |     }
374 |   }
375 | }
376 | ```
377 | 
378 | ### Direct Node.js Execution
379 | 
380 | If you cloned the repository:
381 | 
382 | ```json
383 | {
384 |   "mcpServers": {
385 |     "airtable": {
386 |       "command": "node",
387 |       "args": [
388 |         "/path/to/airtable-mcp/airtable_simple.js",
389 |         "--token",
390 |         "YOUR_TOKEN",
391 |         "--base",
392 |         "YOUR_BASE_ID"
393 |       ]
394 |     }
395 |   }
396 | }
397 | ```
398 | 
399 | ## 🧪 Testing
400 | 
401 | ### 🔷 TypeScript Testing
402 | 
403 | Run the comprehensive TypeScript test suite:
404 | 
405 | ```bash
406 | # Install dependencies first
407 | npm install
408 | 
409 | # Run TypeScript type checking
410 | npm run test:types
411 | 
412 | # Run full TypeScript test suite
413 | npm run test:ts
414 | 
415 | # Build and test TypeScript server
416 | npm run build
417 | npm run start:ts
418 | ```
419 | 
420 | ### 📦 JavaScript Testing
421 | 
422 | Run the comprehensive test suite to verify all 33 tools:
423 | 
424 | ```bash
425 | # Set environment variables first
426 | export AIRTABLE_TOKEN=your_token
427 | export AIRTABLE_BASE_ID=your_base_id
428 | 
429 | # Start the server
430 | node airtable_simple.js &
431 | 
432 | # Run comprehensive tests (v1.6.0+)
433 | ./test_v1.6.0_comprehensive.sh
434 | ```
435 | 
436 | The TypeScript test suite validates:
437 | - **Type Safety**: Compile-time validation of all interfaces
438 | - **Enterprise Testing**: 33 tools with strict type checking
439 | - **AI Prompt Validation**: All 10 AI templates with proper typing
440 | - **Error Handling**: Type-safe error management
441 | - **Performance**: Concurrent operations with type safety
442 | - **Integration**: Full MCP protocol compliance
443 | 
444 | The JavaScript test suite validates:
445 | - All 33 tools with real API calls
446 | - Complete CRUD operations
447 | - Advanced schema management
448 | - Batch operations (create/update/delete multiple records)
449 | - Attachment management via URLs
450 | - Advanced view creation and metadata
451 | - Base management and collaboration tools
452 | - Webhook management
453 | - Error handling and edge cases
454 | - Security verification
455 | - 100% test coverage
456 | 
457 | ## 🐛 Troubleshooting
458 | 
459 | ### "Connection Refused" Error
460 | - Ensure the MCP server is running
461 | - Check that port 8010 is not blocked
462 | - Restart your MCP client
463 | 
464 | ### "Invalid Token" Error
465 | - Verify your Personal Access Token is correct
466 | - Check that the token has the required scopes
467 | - Ensure no extra spaces in your credentials
468 | 
469 | ### "Base Not Found" Error
470 | - Confirm your Base ID is correct
471 | - Check that your token has access to the base
472 | 
473 | ### Port Conflicts
474 | If port 8010 is in use:
475 | ```bash
476 | lsof -ti:8010 | xargs kill -9
477 | ```
478 | 
479 | ## 📚 Documentation
480 | 
481 | ### 🔷 TypeScript Documentation
482 | - 📘 [TypeScript Examples](./examples/typescript/) - Complete type-safe usage examples
483 | - 🏗️ [Type Definitions](./types/) - Comprehensive type definitions for all features
484 | - 🧪 [TypeScript Testing](./src/test-suite.ts) - Enterprise-grade testing framework
485 | 
486 | ### 📦 General Documentation  
487 | - 🎆 [Release Notes v3.1.0](./RELEASE_NOTES_v3.1.0.md) - **Latest TypeScript release**
488 | - [Release Notes v1.6.0](./RELEASE_NOTES_v1.6.0.md) - Major feature release
489 | - [Release Notes v1.5.0](./RELEASE_NOTES_v1.5.0.md)
490 | - [Release Notes v1.4.0](./RELEASE_NOTES_v1.4.0.md)
491 | - [Detailed Setup Guide](./CLAUDE_INTEGRATION.md)
492 | - [Development Guide](./DEVELOPMENT.md)
493 | - [Security Notice](./SECURITY_NOTICE.md)
494 | 
495 | ## 📦 Version History
496 | 
497 | - **v3.1.0** (2025-08-16) - 🔷 **TypeScript Support**: Enterprise-grade type safety, comprehensive type definitions, dual JS/TS distribution
498 | - **v3.0.0** (2025-08-16) - 🤖 **Revolutionary AI Agent**: 10 intelligent prompts, predictive analytics, natural language processing
499 | - **v2.2.3** (2025-08-16) - 🔒 **Security release**: Final XSS vulnerability fixes and enhanced validation
500 | - **v2.2.0** (2025-08-16) - 🏆 **Major release**: Complete MCP 2024-11-05 protocol implementation
501 | - **v1.6.0** (2025-08-15) - 🎆 **Major release**: Added batch operations & attachment management (33 total tools)
502 | - **v1.5.0** (2025-08-15) - Added comprehensive schema management (23 total tools)
503 | - **v1.4.0** (2025-08-14) - Added webhook support and enhanced CRUD operations (12 tools)
504 | - **v1.2.4** (2025-08-12) - Security fixes and stability improvements
505 | - **v1.2.3** (2025-08-11) - Bug fixes and error handling
506 | - **v1.2.2** (2025-08-10) - Initial stable release
507 | 
508 | ## 📂 Project Structure
509 | 
510 | ```
511 | airtable-mcp/
512 | ├── src/                    # Source code
513 | │   ├── index.js           # Main entry point
514 | │   ├── typescript/        # TypeScript implementation
515 | │   ├── javascript/        # JavaScript implementation
516 | │   └── python/            # Python implementation
517 | ├── dist/                  # Compiled TypeScript output
518 | ├── docs/                  # Documentation
519 | │   ├── guides/           # User guides
520 | │   └── releases/         # Release notes
521 | ├── tests/                # Test files
522 | ├── examples/             # Usage examples
523 | └── types/                # TypeScript type definitions
524 | ```
525 | 
526 | ## 🤝 Contributing
527 | 
528 | Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
529 | 
530 | ## 📄 License
531 | 
532 | MIT License - see [LICENSE](./LICENSE) file for details
533 | 
534 | ## 🙏 Acknowledgments
535 | 
536 | - Built for the [Model Context Protocol](https://modelcontextprotocol.io/)
537 | - Powered by [Airtable API](https://airtable.com/developers/web/api/introduction)
538 | - Compatible with [Claude Desktop](https://claude.ai/) and other MCP clients
539 | 
540 | ## 📮 Support
541 | 
542 | - **Issues**: [GitHub Issues](https://github.com/rashidazarang/airtable-mcp/issues)
543 | - **Discussions**: [GitHub Discussions](https://github.com/rashidazarang/airtable-mcp/discussions)
544 | 
545 | ---
546 | 
547 | **Version**: 3.2.4 | **Status**: 🔷 TypeScript Fixed + 🤖 AI Agent | **MCP Protocol**: 2024-11-05 Complete | **Type Safety**: Enterprise-Grade | **Intelligence**: 10 AI Prompts | **Security**: Fully Patched (XSS Fixed) | **Last Updated**: September 9, 2025
548 | 
```

--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Contributing to Airtable MCP
 2 | 
 3 | Thank you for your interest in contributing to Airtable MCP! This guide will help you get started with contributing to this project.
 4 | 
 5 | ## Development Setup
 6 | 
 7 | 1. **Clone the repository**:
 8 |    ```bash
 9 |    git clone https://github.com/rashidazarang/airtable-mcp.git
10 |    cd airtable-mcp
11 |    ```
12 | 
13 | 2. **Install dependencies**:
14 |    ```bash
15 |    pip install -r requirements.txt
16 |    ```
17 | 
18 | 3. **Environment setup**:
19 |    Create a `.env` file in the root directory with your Airtable API token:
20 |    ```
21 |    AIRTABLE_PERSONAL_ACCESS_TOKEN=your_token_here
22 |    AIRTABLE_BASE_ID=optional_default_base_id
23 |    ```
24 | 
25 | ## Running the Server
26 | 
27 | You can run the server directly with Python:
28 | 
29 | ```bash
30 | python3.10 inspector_server.py --token "your_token" --base "your_base_id"
31 | ```
32 | 
33 | Or through the Node.js wrapper:
34 | 
35 | ```bash
36 | node index.js --token "your_token" --base "your_base_id"
37 | ```
38 | 
39 | ## Testing
40 | 
41 | Run the test client to verify your Airtable API access:
42 | 
43 | ```bash
44 | python3.10 test_client.py
45 | ```
46 | 
47 | ## Pull Request Process
48 | 
49 | 1. **Fork the Repository** on GitHub.
50 | 
51 | 2. **Create a Branch** for your feature or bugfix.
52 | 
53 | 3. **Make Changes** according to the project style guidelines.
54 | 
55 | 4. **Test Thoroughly** to ensure your changes work as expected.
56 | 
57 | 5. **Document Changes** in the README.md if necessary.
58 | 
59 | 6. **Submit a Pull Request** to the main repository.
60 | 
61 | ## Coding Guidelines
62 | 
63 | - Follow Python PEP 8 style guidelines
64 | - Write docstrings for all functions, classes, and modules
65 | - Include type hints for function parameters and return values
66 | - Write clear commit messages
67 | 
68 | ## Adding New Tools
69 | 
70 | When adding new Airtable API tools:
71 | 
72 | 1. Add the tool function to `inspector_server.py` using the `@app.tool()` decorator
73 | 2. Define clear parameter and return types
74 | 3. Provide a descriptive docstring for the tool
75 | 4. Update the inspector.py file to include the new tool in the JSON schema
76 | 5. Add error handling for API requests
77 | 6. Update the README.md to document the new tool
78 | 
79 | ## License
80 | 
81 | By contributing to this project, you agree that your contributions will be licensed under the project's MIT License. 
```

--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------

```markdown
  1 | # 🤝 Contributor Covenant Code of Conduct
  2 | 
  3 | ## 🎯 Our Pledge
  4 | 
  5 | We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
  6 | 
  7 | We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community, while working together towards our **100/100 Trust Score** goal.
  8 | 
  9 | ## 📋 Our Standards
 10 | 
 11 | Examples of behavior that contributes to a positive environment for our community include:
 12 | 
 13 | ### ✅ Positive Behaviors
 14 | - **🤝 Respectful Communication**: Using welcoming and inclusive language
 15 | - **🎯 Constructive Feedback**: Providing and gracefully accepting constructive criticism
 16 | - **🙏 Empathy**: Showing empathy towards other community members
 17 | - **🔒 Security Focus**: Prioritizing security and responsible disclosure
 18 | - **📚 Knowledge Sharing**: Helping others learn and grow
 19 | - **🚀 Quality Commitment**: Contributing to our Trust Score improvement goals
 20 | - **🌟 Recognition**: Acknowledging others' contributions and efforts
 21 | - **🔧 Solution-Oriented**: Focusing on what is best for the overall community
 22 | 
 23 | ### ❌ Unacceptable Behaviors
 24 | - **💬 Harassment**: Trolling, insulting/derogatory comments, personal or political attacks
 25 | - **📧 Privacy Violations**: Publishing others' private information without permission
 26 | - **🔓 Security Violations**: Publicly disclosing security vulnerabilities before responsible disclosure
 27 | - **🎯 Scope Creep**: Other conduct which could reasonably be considered inappropriate in a professional setting
 28 | - **📊 Spam**: Excessive self-promotion or off-topic content
 29 | - **🚫 Discrimination**: Any form of discrimination or exclusion based on protected characteristics
 30 | 
 31 | ## 🛡️ Security-Specific Guidelines
 32 | 
 33 | Given our focus on achieving a **100/100 Trust Score**, we have additional guidelines around security:
 34 | 
 35 | ### 🔒 Responsible Disclosure
 36 | - Report security vulnerabilities privately through appropriate channels
 37 | - Do not publicly disclose vulnerabilities until fixes are available
 38 | - Follow coordinated disclosure timelines with maintainers
 39 | 
 40 | ### 🛡️ Security Discussions
 41 | - Keep security discussions constructive and solution-focused
 42 | - Avoid fear-mongering or exaggerating security issues
 43 | - Provide evidence-based security recommendations
 44 | 
 45 | ## 📊 Trust Score Community Standards
 46 | 
 47 | Our community is committed to building the most trusted MCP server for Airtable:
 48 | 
 49 | ### 🎯 Quality Standards
 50 | - **🧪 Testing**: All contributions include appropriate tests
 51 | - **📚 Documentation**: Clear documentation accompanies code changes
 52 | - **🔍 Code Review**: Constructive and thorough code reviews
 53 | - **📈 Continuous Improvement**: Regular updates and enhancements
 54 | 
 55 | ### 🤝 Collaboration Standards
 56 | - **💡 Innovation**: Encouraging creative solutions and new ideas
 57 | - **🔄 Iteration**: Embracing feedback and iterative improvement
 58 | - **🌐 Inclusivity**: Welcoming contributors of all skill levels
 59 | - **📊 Transparency**: Open communication about goals and progress
 60 | 
 61 | ## 🚀 Enforcement Responsibilities
 62 | 
 63 | Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
 64 | 
 65 | ### 👥 Leadership Team
 66 | - **Primary Maintainer**: [@rashidazarang](https://github.com/rashidazarang)
 67 | - **Security Team**: security@[domain]
 68 | - **Community Moderators**: [to be appointed as community grows]
 69 | 
 70 | ### 🔧 Enforcement Powers
 71 | Community leaders have the right and responsibility to:
 72 | - Remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions
 73 | - Temporarily or permanently ban contributors for inappropriate behaviors
 74 | - Communicate expectations and consequences clearly
 75 | 
 76 | ## 📏 Scope
 77 | 
 78 | This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include:
 79 | 
 80 | ### 📍 Community Spaces
 81 | - **GitHub Repository**: Issues, PRs, discussions, and project boards
 82 | - **Communication Channels**: Discord, Slack, or other official channels
 83 | - **Documentation**: Wiki, docs site, and README files
 84 | - **Events**: Conferences, meetups, and online presentations
 85 | 
 86 | ### 🌐 Public Representation
 87 | - Using an official e-mail address
 88 | - Posting via an official social media account
 89 | - Acting as an appointed representative at online or offline events
 90 | - Speaking about the project in interviews or presentations
 91 | 
 92 | ## 📞 Reporting Guidelines
 93 | 
 94 | ### 🚨 How to Report
 95 | If you experience or witness unacceptable behavior, or have any other concerns, please report it by contacting the community leaders:
 96 | 
 97 | - **General Issues**: conduct@[domain]
 98 | - **Security Issues**: security@[domain]
 99 | - **Direct Contact**: [@rashidazarang](https://github.com/rashidazarang)
100 | - **Anonymous Reporting**: [to be set up as community grows]
101 | 
102 | ### 📝 What to Include
103 | When reporting, please include:
104 | - Your contact information (if comfortable sharing)
105 | - Details of the incident, including:
106 |   - When and where it occurred
107 |   - What happened
108 |   - Who was involved
109 |   - Any available evidence (screenshots, links, etc.)
110 | - Any additional context that would be helpful
111 | 
112 | ### ⚡ Response Timeline
113 | - **Acknowledgment**: Within 24 hours
114 | - **Initial Review**: Within 48 hours
115 | - **Investigation**: 1-7 days (depending on complexity)
116 | - **Resolution**: Varies based on the situation
117 | - **Follow-up**: Ongoing as needed
118 | 
119 | ## 🔧 Enforcement Guidelines
120 | 
121 | Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
122 | 
123 | ### 1. 📝 Correction
124 | **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
125 | 
126 | **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
127 | 
128 | ### 2. ⚠️ Warning
129 | **Community Impact**: A violation through a single incident or series of actions.
130 | 
131 | **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
132 | 
133 | ### 3. ⏸️ Temporary Ban
134 | **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
135 | 
136 | **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
137 | 
138 | ### 4. 🚫 Permanent Ban
139 | **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
140 | 
141 | **Consequence**: A permanent ban from any sort of public interaction within the community.
142 | 
143 | ## 🔄 Appeals Process
144 | 
145 | ### 📝 How to Appeal
146 | If you believe you have been unfairly sanctioned, you may appeal by:
147 | 1. Contacting the community leaders at appeals@[domain]
148 | 2. Providing a detailed explanation of why you believe the action was unfair
149 | 3. Including any relevant evidence or context
150 | 4. Waiting for review and response
151 | 
152 | ### ⏱️ Appeal Timeline
153 | - **Review Period**: 7-14 days
154 | - **Decision**: Final decisions will be communicated clearly
155 | - **Implementation**: Changes take effect immediately upon decision
156 | 
157 | ## 🙏 Attribution
158 | 
159 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
160 | 
161 | Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
162 | 
163 | For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
164 | 
165 | ## 🎯 Our Commitment
166 | 
167 | As we work towards our **100/100 Trust Score** goal, we recognize that trust extends beyond technical excellence to include community trust. This Code of Conduct is our commitment to maintaining a community that reflects the same high standards of security, quality, and reliability that we strive for in our code.
168 | 
169 | Together, we're not just building software – we're building a trusted community that makes the entire MCP ecosystem stronger. 🚀
170 | 
171 | ---
172 | 
173 | **Last Updated**: August 2025
174 | **Version**: 1.0
175 | **Contact**: conduct@[domain]
176 | 
177 | [homepage]: https://www.contributor-covenant.org
178 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
179 | [Mozilla CoC]: https://github.com/mozilla/diversity
180 | [FAQ]: https://www.contributor-covenant.org/faq
181 | [translations]: https://www.contributor-covenant.org/translations
```

--------------------------------------------------------------------------------
/examples/claude_config.json:
--------------------------------------------------------------------------------

```json
1 | {
2 |   "airtable_token": "YOUR_AIRTABLE_TOKEN",
3 |   "base_id": "YOUR_BASE_ID"
4 | } 
```

--------------------------------------------------------------------------------
/examples/claude_simple_config.json:
--------------------------------------------------------------------------------

```json
1 | {
2 |   "mcpServers": {
3 |     "airtable": {
4 |       "url": "http://localhost:8010/mcp"
5 |     }
6 |   }
7 | } 
```

--------------------------------------------------------------------------------
/src/python/airtable_mcp/__init__.py:
--------------------------------------------------------------------------------

```python
1 | """
2 | Airtable MCP - Airtable integration for AI via Model Context Protocol
3 | """
4 | 
5 | __version__ = "0.1.0" 
```

--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/custom.md:
--------------------------------------------------------------------------------

```markdown
 1 | ---
 2 | name: Custom issue template
 3 | about: Describe this issue template's purpose here.
 4 | title: ''
 5 | labels: ''
 6 | assignees: ''
 7 | 
 8 | ---
 9 | 
10 | 
11 | 
```

--------------------------------------------------------------------------------
/types/typescript/tools-schemas.d.ts:
--------------------------------------------------------------------------------

```typescript
1 | /**
2 |  * Runtime tool schemas for Airtable MCP Server
3 |  */
4 | import type { ToolSchema } from './index';
5 | export declare const COMPLETE_TOOL_SCHEMAS: ToolSchema[];
6 | 
```

--------------------------------------------------------------------------------
/types/typescript/prompt-templates.d.ts:
--------------------------------------------------------------------------------

```typescript
1 | /**
2 |  * Runtime AI prompt templates for Airtable MCP Server
3 |  */
4 | import type { PromptSchema } from './index';
5 | export declare const AI_PROMPT_TEMPLATES: Record<string, PromptSchema>;
6 | 
```

--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------

```
 1 | airtable-python-wrapper>=0.15.3
 2 | anthropic>=0.19.1
 3 | argparse>=1.4.0
 4 | python-dotenv>=1.0.0
 5 | pydantic>=2.4.2
 6 | # MCP core will be installed by Smithery during deployment
 7 | requests>=2.31.0
 8 | typing-extensions>=4.7.1
 9 | websockets>=11.0.3
10 | mcp>=1.4.1 
```

--------------------------------------------------------------------------------
/examples/windsurf_mcp_config.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "mcpServers": {
 3 |     "AIRTABLE": {
 4 |       "command": "npx",
 5 |       "args": [
 6 |         "-y",
 7 |         "@smithery/cli@latest",
 8 |         "run",
 9 |         "@rashidazarang/airtable-mcp",
10 |         "--token",
11 |         "YOUR_AIRTABLE_TOKEN",
12 |         "--base",
13 |         "YOUR_BASE_ID"
14 |       ]
15 |     }
16 |   }
17 | } 
```

--------------------------------------------------------------------------------
/types/typescript/errors.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * Runtime error classes for Airtable MCP Server
 3 |  */
 4 | export declare class AirtableError extends Error {
 5 |     code: string;
 6 |     statusCode?: number;
 7 |     constructor(message: string, code: string, statusCode?: number);
 8 | }
 9 | export declare class ValidationError extends Error {
10 |     field: string;
11 |     constructor(message: string, field: string);
12 | }
13 | 
```

--------------------------------------------------------------------------------
/examples/example-tasks-update.json:
--------------------------------------------------------------------------------

```json
 1 | [
 2 |   {
 3 |     "id": "rec1qeTzIUy1p8DF5",
 4 |     "fields": {
 5 |       "Status": "Completed",
 6 |       "Description": "Implement the new feature requested by the client (UPDATED)"
 7 |     }
 8 |   },
 9 |   {
10 |     "id": "recA443jGkhk4fe8B",
11 |     "fields": {
12 |       "Status": "Completed",
13 |       "Priority": "High"
14 |     }
15 |   },
16 |   {
17 |     "id": "recvMTGZYKi8Dcds4",
18 |     "fields": {
19 |       "Status": "In Progress",
20 |       "Description": "Write comprehensive documentation for the project (IN PROGRESS)"
21 |     }
22 |   }
23 | ] 
```

--------------------------------------------------------------------------------
/src/typescript/errors.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * Runtime error classes for Airtable MCP Server
 3 |  */
 4 | 
 5 | export class AirtableError extends Error {
 6 |   public code: string;
 7 |   public statusCode?: number;
 8 |   
 9 |   constructor(message: string, code: string, statusCode?: number) {
10 |     super(message);
11 |     this.name = 'AirtableError';
12 |     this.code = code;
13 |     if (statusCode !== undefined) {
14 |       this.statusCode = statusCode;
15 |     }
16 |   }
17 | }
18 | 
19 | export class ValidationError extends Error {
20 |   public field: string;
21 |   
22 |   constructor(message: string, field: string) {
23 |     super(message);
24 |     this.name = 'ValidationError';
25 |     this.field = field;
26 |   }
27 | }
```

--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------

```markdown
 1 | ---
 2 | name: Feature request
 3 | about: Suggest an idea for this project
 4 | title: ''
 5 | labels: ''
 6 | assignees: ''
 7 | 
 8 | ---
 9 | 
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 | 
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 | 
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 | 
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 | 
```

--------------------------------------------------------------------------------
/examples/typescript/claude-desktop-config.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "mcpServers": {
 3 |     "airtable-typescript": {
 4 |       "command": "npx",
 5 |       "args": [
 6 |         "@rashidazarang/airtable-mcp",
 7 |         "--token",
 8 |         "YOUR_AIRTABLE_TOKEN",
 9 |         "--base", 
10 |         "YOUR_BASE_ID"
11 |       ],
12 |       "env": {
13 |         "NODE_ENV": "production",
14 |         "LOG_LEVEL": "INFO"
15 |       }
16 |     },
17 |     "airtable-typescript-dev": {
18 |       "command": "npm",
19 |       "args": ["run", "start:ts"],
20 |       "cwd": "/path/to/your/airtable-mcp",
21 |       "env": {
22 |         "AIRTABLE_TOKEN": "YOUR_AIRTABLE_TOKEN",
23 |         "AIRTABLE_BASE_ID": "YOUR_BASE_ID",
24 |         "NODE_ENV": "development",
25 |         "LOG_LEVEL": "DEBUG"
26 |       }
27 |     }
28 |   }
29 | }
```

--------------------------------------------------------------------------------
/examples/example-tasks.json:
--------------------------------------------------------------------------------

```json
 1 | [
 2 |   {
 3 |     "id": "rec1qeTzIUy1p8DF5",
 4 |     "Name": "Add new feature",
 5 |     "Description": "Implement the new feature requested by the client",
 6 |     "Status": "In Progress",
 7 |     "Priority": "Medium",
 8 |     "DueDate": "2024-01-15"
 9 |   },
10 |   {
11 |     "id": "recA443jGkhk4fe8B",
12 |     "Name": "Fix login bug",
13 |     "Description": "Users are experiencing issues with the login process",
14 |     "Status": "In Progress",
15 |     "Priority": "Critical",
16 |     "DueDate": "2023-11-15"
17 |   },
18 |   {
19 |     "id": "recvMTGZYKi8Dcds4",
20 |     "Name": "Complete project documentation",
21 |     "Description": "Write comprehensive documentation for the project",
22 |     "Status": "In Progress",
23 |     "Priority": "High",
24 |     "DueDate": "2023-12-31"
25 |   }
26 | ]
```

--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------

```markdown
 1 | ---
 2 | name: Bug report
 3 | about: Create a report to help us improve
 4 | title: ''
 5 | labels: ''
 6 | assignees: ''
 7 | 
 8 | ---
 9 | 
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 | 
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 | 
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 | 
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 | 
26 | **Desktop (please complete the following information):**
27 |  - OS: [e.g. iOS]
28 |  - Browser [e.g. chrome, safari]
29 |  - Version [e.g. 22]
30 | 
31 | **Smartphone (please complete the following information):**
32 |  - Device: [e.g. iPhone6]
33 |  - OS: [e.g. iOS8.1]
34 |  - Browser [e.g. stock browser, safari]
35 |  - Version [e.g. 22]
36 | 
37 | **Additional context**
38 | Add any other context about the problem here.
39 | 
```

--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------

```javascript
 1 | module.exports = {
 2 |   preset: 'ts-jest',
 3 |   testEnvironment: 'node',
 4 |   roots: ['<rootDir>/src', '<rootDir>/tests'],
 5 |   testMatch: [
 6 |     '**/__tests__/**/*.+(ts|tsx|js)',
 7 |     '**/?(*.)+(spec|test).+(ts|tsx|js)',
 8 |   ],
 9 |   transform: {
10 |     '^.+\\.(ts|tsx)$': 'ts-jest',
11 |   },
12 |   collectCoverageFrom: [
13 |     'src/**/*.{js,ts}',
14 |     '!src/**/*.d.ts',
15 |     '!src/**/index.{js,ts}',
16 |     '!src/**/*.test.{js,ts}',
17 |     '!src/**/*.spec.{js,ts}',
18 |   ],
19 |   coverageDirectory: 'coverage',
20 |   coverageReporters: ['text', 'lcov', 'html'],
21 |   coverageThreshold: {
22 |     global: {
23 |       branches: 70,
24 |       functions: 70,
25 |       lines: 70,
26 |       statements: 70,
27 |     },
28 |   },
29 |   moduleNameMapper: {
30 |     '^@/(.*)$': '<rootDir>/src/$1',
31 |     '^@types/(.*)$': '<rootDir>/types/$1',
32 |   },
33 |   setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
34 |   testTimeout: 10000,
35 |   verbose: true,
36 | };
```

--------------------------------------------------------------------------------
/src/python/setup.py:
--------------------------------------------------------------------------------

```python
 1 | #!/usr/bin/env python3
 2 | 
 3 | from setuptools import setup, find_packages
 4 | 
 5 | with open("README.md", "r", encoding="utf-8") as fh:
 6 |     long_description = fh.read()
 7 | 
 8 | with open("requirements.txt", "r", encoding="utf-8") as req_file:
 9 |     requirements = req_file.read().splitlines()
10 | 
11 | setup(
12 |     name="airtable-mcp",
13 |     version="1.1.0",
14 |     author="Rashid Azarang",
15 |     author_email="[email protected]",
16 |     description="Airtable MCP for AI tools - updated to work with MCP SDK 1.4.1+",
17 |     long_description=long_description,
18 |     long_description_content_type="text/markdown",
19 |     url="https://github.com/rashidazarang/airtable-mcp",
20 |     packages=find_packages(),
21 |     install_requires=requirements,
22 |     classifiers=[
23 |         "Programming Language :: Python :: 3.10",
24 |         "License :: OSI Approved :: MIT License",
25 |         "Operating System :: OS Independent",
26 |     ],
27 |     python_requires=">=3.10",
28 |     include_package_data=True,
29 | ) 
```

--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES2020",
 4 |     "module": "CommonJS",
 5 |     "lib": ["ES2020"],
 6 |     "outDir": "./dist",
 7 |     "rootDir": "./src",
 8 |     "strict": true,
 9 |     "esModuleInterop": true,
10 |     "skipLibCheck": true,
11 |     "forceConsistentCasingInFileNames": true,
12 |     "moduleResolution": "node",
13 |     "resolveJsonModule": true,
14 |     "declaration": true,
15 |     "declarationDir": "./types",
16 |     "sourceMap": true,
17 |     "removeComments": false,
18 |     "noImplicitAny": true,
19 |     "noImplicitReturns": true,
20 |     "noImplicitThis": true,
21 |     "noUnusedLocals": true,
22 |     "noUnusedParameters": true,
23 |     "exactOptionalPropertyTypes": true,
24 |     "noImplicitOverride": true,
25 |     "noPropertyAccessFromIndexSignature": false,
26 |     "noUncheckedIndexedAccess": true
27 |   },
28 |   "include": [
29 |     "src/typescript/**/*"
30 |   ],
31 |   "exclude": [
32 |     "node_modules",
33 |     "dist",
34 |     "types",
35 |     "**/*.test.ts",
36 |     "**/*.spec.ts",
37 |     "src/javascript/**/*",
38 |     "src/python/**/*"
39 |   ]
40 | }
```

--------------------------------------------------------------------------------
/docker/Dockerfile:
--------------------------------------------------------------------------------

```dockerfile
 1 | FROM python:3.10-slim
 2 | 
 3 | WORKDIR /app
 4 | 
 5 | # Install Node.js for the NPX functionality
 6 | RUN apt-get update && \
 7 |     apt-get install -y curl gnupg && \
 8 |     curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
 9 |     apt-get install -y nodejs && \
10 |     apt-get clean && \
11 |     rm -rf /var/lib/apt/lists/*
12 | 
13 | # Copy package files first (for better layer caching)
14 | COPY package.json /app/
15 | COPY package-lock.json /app/
16 | 
17 | # Install Node.js dependencies
18 | RUN npm install
19 | 
20 | # Copy Python requirements and install
21 | COPY requirements.txt /app/
22 | RUN pip install --no-cache-dir -r requirements.txt
23 | 
24 | # Copy source code
25 | COPY index.js /app/
26 | COPY inspector.py /app/
27 | COPY inspector_server.py /app/
28 | COPY airtable_mcp/ /app/airtable_mcp/
29 | 
30 | # Set environment variables
31 | ENV NODE_ENV=production
32 | ENV PYTHONUNBUFFERED=1
33 | 
34 | # Expose the port the server might run on
35 | EXPOSE 3000
36 | 
37 | # Start the server in STDIO mode by default
38 | # Smithery will override this with their own command
39 | CMD ["python3", "inspector_server.py"] 
```

--------------------------------------------------------------------------------
/examples/python_debug_patch.txt:
--------------------------------------------------------------------------------

```
 1 | # Add proper error handling
 2 | import traceback
 3 | import sys
 4 | 
 5 | # Override the default error handlers to format errors as proper JSON
 6 | def handle_exceptions(func):
 7 |     async def wrapper(*args, **kwargs):
 8 |         try:
 9 |             return await func(*args, **kwargs)
10 |         except Exception as e:
11 |             error_trace = traceback.format_exc()
12 |             sys.stderr.write(f"Error in MCP handler: {str(e)}\n{error_trace}\n")
13 |             # Return a properly formatted JSON error
14 |             return {"error": {"code": -32000, "message": str(e)}}
15 |     return wrapper
16 | 
17 | # Apply the decorator to all RPC methods
18 | original_rpc_method = app.rpc_method
19 | def patched_rpc_method(*args, **kwargs):
20 |     def decorator(func):
21 |         wrapped_func = handle_exceptions(func)
22 |         return original_rpc_method(*args, **kwargs)(wrapped_func)
23 |     return decorator
24 | 
25 | # Then add this line right before creating the FastMCP instance:
26 | # Replace app.rpc_method with our patched version
27 | app.rpc_method = patched_rpc_method 
```

--------------------------------------------------------------------------------
/bin/airtable-mcp.js:
--------------------------------------------------------------------------------

```javascript
 1 | #!/usr/bin/env node
 2 | 
 3 | const { spawn } = require('child_process');
 4 | const path = require('path');
 5 | 
 6 | // Find the Python interpreter
 7 | const getPythonPath = () => {
 8 |   try {
 9 |     const whichPython = require('child_process').execSync('which python3.10').toString().trim();
10 |     return whichPython;
11 |   } catch (e) {
12 |     try {
13 |       const whichPython = require('child_process').execSync('which python3').toString().trim();
14 |       return whichPython;
15 |     } catch (e) {
16 |       return 'python';
17 |     }
18 |   }
19 | };
20 | 
21 | const pythonPath = getPythonPath();
22 | const serverScript = path.join(__dirname, '..', 'airtable_mcp', 'src', 'server.py');
23 | 
24 | // Get the arguments
25 | const args = process.argv.slice(2);
26 | 
27 | // Construct the full command
28 | const serverProcess = spawn(pythonPath, [serverScript, ...args], {
29 |   stdio: 'inherit',
30 | });
31 | 
32 | // Handle process exit
33 | serverProcess.on('close', (code) => {
34 |   process.exit(code);
35 | });
36 | 
37 | // Handle signals
38 | process.on('SIGINT', () => {
39 |   serverProcess.kill('SIGINT');
40 | });
41 | 
42 | process.on('SIGTERM', () => {
43 |   serverProcess.kill('SIGTERM');
44 | }); 
```

--------------------------------------------------------------------------------
/src/typescript/test-suite.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * TypeScript Test Suite for Airtable MCP Server
 3 |  * Comprehensive type-safe testing with enterprise validation
 4 |  */
 5 | interface TestResult {
 6 |     name: string;
 7 |     passed: boolean;
 8 |     error?: string;
 9 |     duration: number;
10 | }
11 | interface TestSuite {
12 |     name: string;
13 |     tests: TestResult[];
14 |     totalPassed: number;
15 |     totalFailed: number;
16 |     totalDuration: number;
17 | }
18 | declare class TypeScriptTestRunner {
19 |     private results;
20 |     runTest(name: string, testFn: () => Promise<void>): Promise<TestResult>;
21 |     runSuite(suiteName: string, tests: Array<{
22 |         name: string;
23 |         fn: () => Promise<void>;
24 |     }>): Promise<TestSuite>;
25 |     generateReport(): void;
26 | }
27 | declare class MockAirtableMCPServer {
28 |     initialize(): Promise<any>;
29 |     handleToolCall(name: string, params: Record<string, unknown>): Promise<any>;
30 |     handlePromptGet(_name: string, _args: Record<string, unknown>): Promise<any>;
31 | }
32 | declare function runAllTests(): Promise<void>;
33 | export { TypeScriptTestRunner, MockAirtableMCPServer, runAllTests, TestResult, TestSuite };
34 | 
```

--------------------------------------------------------------------------------
/types/typescript/test-suite.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * TypeScript Test Suite for Airtable MCP Server
 3 |  * Comprehensive type-safe testing with enterprise validation
 4 |  */
 5 | interface TestResult {
 6 |     name: string;
 7 |     passed: boolean;
 8 |     error?: string;
 9 |     duration: number;
10 | }
11 | interface TestSuite {
12 |     name: string;
13 |     tests: TestResult[];
14 |     totalPassed: number;
15 |     totalFailed: number;
16 |     totalDuration: number;
17 | }
18 | declare class TypeScriptTestRunner {
19 |     private results;
20 |     runTest(name: string, testFn: () => Promise<void>): Promise<TestResult>;
21 |     runSuite(suiteName: string, tests: Array<{
22 |         name: string;
23 |         fn: () => Promise<void>;
24 |     }>): Promise<TestSuite>;
25 |     generateReport(): void;
26 | }
27 | declare class MockAirtableMCPServer {
28 |     initialize(): Promise<any>;
29 |     handleToolCall(name: string, params: Record<string, unknown>): Promise<any>;
30 |     handlePromptGet(_name: string, _args: Record<string, unknown>): Promise<any>;
31 | }
32 | declare function runAllTests(): Promise<void>;
33 | export { TypeScriptTestRunner, MockAirtableMCPServer, runAllTests, TestResult, TestSuite };
34 | 
```

--------------------------------------------------------------------------------
/SECURITY_NOTICE.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Security Notice
 2 | 
 3 | ## Important: API Token Rotation Required
 4 | 
 5 | If you have been using or testing this repository before January 2025, please note that hardcoded API tokens were previously included in test files. These have been removed and replaced with environment variable requirements.
 6 | 
 7 | ### Actions Required:
 8 | 
 9 | 1. **If you used the exposed tokens**: 
10 |    - These tokens have been revoked and are no longer valid
11 |    - You must use your own Airtable API credentials
12 | 
13 | 2. **For all users**:
14 |    - Never commit API tokens to version control
15 |    - Always use environment variables or secure configuration files
16 |    - Add `.env` to your `.gitignore` file
17 | 
18 | ### Secure Configuration
19 | 
20 | Set your credentials using environment variables:
21 | 
22 | ```bash
23 | export AIRTABLE_TOKEN="your_personal_token_here"
24 | export AIRTABLE_BASE_ID="your_base_id_here"
25 | ```
26 | 
27 | Or create a `.env` file (never commit this):
28 | 
29 | ```env
30 | AIRTABLE_TOKEN=your_personal_token_here
31 | AIRTABLE_BASE_ID=your_base_id_here
32 | ```
33 | 
34 | ### Reporting Security Issues
35 | 
36 | If you discover any security vulnerabilities, please report them to:
37 | - Open an issue on GitHub (without including sensitive details)
38 | - Contact the maintainer directly for sensitive information
39 | 
40 | Thank you for helping keep this project secure.
```

--------------------------------------------------------------------------------
/docs/guides/QUICK_START.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Quick Start Guide for Claude Users
 2 | 
 3 | This guide provides simple instructions for getting the Airtable MCP working with Claude.
 4 | 
 5 | ## Step 1: Clone the repository
 6 | 
 7 | ```bash
 8 | git clone https://github.com/rashidazarang/airtable-mcp.git
 9 | cd airtable-mcp
10 | ```
11 | 
12 | ## Step 2: Install dependencies
13 | 
14 | ```bash
15 | npm install
16 | pip install mcp
17 | ```
18 | 
19 | ## Step 3: Configure Claude
20 | 
21 | In Claude settings, add a new MCP server with this configuration (adjust paths as needed):
22 | 
23 | ```json
24 | {
25 |   "mcpServers": {
26 |     "airtable": {
27 |       "command": "python3",
28 |       "args": [
29 |         "/path/to/airtable-mcp/inspector_server.py",
30 |         "--token",
31 |         "YOUR_AIRTABLE_TOKEN",
32 |         "--base",
33 |         "YOUR_BASE_ID"
34 |       ]
35 |     }
36 |   }
37 | }
38 | ```
39 | 
40 | Replace:
41 | - `/path/to/airtable-mcp/` with the actual path where you cloned the repository
42 | - `YOUR_AIRTABLE_TOKEN` with your Airtable Personal Access Token
43 | - `YOUR_BASE_ID` with your Airtable Base ID
44 | 
45 | ## Step 4: Restart Claude
46 | 
47 | After configuring, restart Claude and try these commands:
48 | 
49 | 1. "List the tables in my Airtable base"
50 | 2. "Show me records from [table name]"
51 | 
52 | ## Troubleshooting
53 | 
54 | If you encounter issues:
55 | 
56 | 1. Check the Claude logs (click on the error message)
57 | 2. Verify your Airtable token and base ID are correct
58 | 3. Make sure you've specified the correct path to `inspector_server.py`
59 | 
60 | This version includes enhanced error handling to properly format JSON responses and avoid "Method not found" errors in Claude. 
```

--------------------------------------------------------------------------------
/smithery.yaml:
--------------------------------------------------------------------------------

```yaml
 1 | # Smithery.ai configuration
 2 | name: "@rashidazarang/airtable-mcp"
 3 | version: "3.2.4"
 4 | description: "Connect your AI tools directly to Airtable. Query, create, update, and delete records using natural language. Features include base management, table operations, schema manipulation, record filtering, and data migration—all through a standardized MCP interface compatible with Claude Desktop and other Claude-powered editors."
 5 | 
 6 | startCommand:
 7 |   type: stdio
 8 |   configSchema:
 9 |     type: object
10 |     properties:
11 |       airtable_token:
12 |         type: string
13 |         description: "Your Airtable Personal Access Token"
14 |         required: true
15 |       base_id:
16 |         type: string
17 |         description: "Your default Airtable base ID"
18 |         required: true
19 |     required: ["airtable_token", "base_id"]
20 |   commandFunction: |
21 |     (config) => {
22 |       // Use the working JavaScript implementation
23 |       return {
24 |         command: "node",
25 |         args: ["airtable_simple.js", "--token", config.airtable_token, "--base", config.base_id],
26 |         env: {
27 |           AIRTABLE_TOKEN: config.airtable_token,
28 |           AIRTABLE_BASE_ID: config.base_id
29 |         }
30 |       };
31 |     }
32 | 
33 | listTools:
34 |   command: "node"
35 |   args: ["airtable_simple.js", "--list-tools"]
36 |   env: {}
37 |   
38 | build:
39 |   dockerfile: "Dockerfile.node"
40 | 
41 | metadata:
42 |   author: "Rashid Azarang"
43 |   license: "MIT"
44 |   repository: "https://github.com/rashidazarang/airtable-mcp"
45 |   homepage: "https://github.com/rashidazarang/airtable-mcp#readme"
```

--------------------------------------------------------------------------------
/docs/releases/RELEASE_NOTES_v1.2.2.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Release Notes - v1.2.2
 2 | 
 3 | ## Major Improvements
 4 | 
 5 | ### Documentation & Setup
 6 | - Completely revamped documentation with focus on Claude Desktop integration
 7 | - Added clear step-by-step installation guide
 8 | - Simplified configuration process with working JSON examples
 9 | - Added detailed troubleshooting section
10 | 
11 | ### Configuration
12 | - Removed complex JSON configuration in favor of simpler format
13 | - Fixed JSON parsing issues with Claude Desktop
14 | - Updated configuration file path for Claude Desktop
15 | - Removed unnecessary escape characters in configuration
16 | 
17 | ### Integration
18 | - Improved Claude Desktop compatibility
19 | - Added 30-second connection establishment guidance
20 | - Added verification steps with example commands
21 | - Enhanced error handling and logging guidance
22 | 
23 | ## Technical Updates
24 | - Updated dependencies to latest versions
25 | - Added @smithery/cli as direct dependency
26 | - Updated Airtable SDK to v0.12.2
27 | - Improved Node.js version compatibility
28 | 
29 | ## Bug Fixes
30 | - Fixed JSON parsing errors in Claude Desktop
31 | - Resolved connection timeout issues
32 | - Fixed configuration file path issues
33 | - Improved error messaging
34 | 
35 | ## Breaking Changes
36 | - Configuration format has changed to use direct parameters instead of JSON config string
37 | - Removed support for complex JSON configurations
38 | - Changed default configuration file location for Claude Desktop
39 | 
40 | ## Migration Guide
41 | If upgrading from v1.2.1 or earlier:
42 | 1. Update your configuration file to use the new format
43 | 2. Remove any escape characters from your token
44 | 3. Restart Claude Desktop after changes
45 | 4. Wait 30 seconds for connection to establish
46 | 
47 | ## Contributors
48 | - @rashidazarang 
```

--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------

```javascript
 1 | #!/usr/bin/env node
 2 | 
 3 | /**
 4 |  * Airtable MCP Server - Main Entry Point
 5 |  * 
 6 |  * This file serves as the primary entry point for the Airtable MCP server.
 7 |  * It automatically selects the best available implementation based on the environment.
 8 |  */
 9 | 
10 | const path = require('path');
11 | const fs = require('fs');
12 | 
13 | // Check which implementation to use based on available files and environment
14 | function getImplementation() {
15 |   // Priority 1: TypeScript compiled version if available
16 |   const distPath = path.join(__dirname, '../dist/typescript/airtable-mcp-server.js');
17 |   if (fs.existsSync(distPath)) {
18 |     return require(distPath);
19 |   }
20 | 
21 |   // Priority 2: Production JavaScript version
22 |   const productionPath = path.join(__dirname, 'javascript/airtable_simple_production.js');
23 |   if (fs.existsSync(productionPath)) {
24 |     return require(productionPath);
25 |   }
26 | 
27 |   // Priority 3: Simple JavaScript version
28 |   const simplePath = path.join(__dirname, 'javascript/airtable_simple.js');
29 |   if (fs.existsSync(simplePath)) {
30 |     return require(simplePath);
31 |   }
32 | 
33 |   // If no implementation found, provide helpful error
34 |   console.error('No Airtable MCP implementation found.');
35 |   console.error('Please run "npm run build" to compile TypeScript sources.');
36 |   process.exit(1);
37 | }
38 | 
39 | // Start the server
40 | const implementation = getImplementation();
41 | 
42 | // Export for use as a module
43 | module.exports = implementation;
44 | 
45 | // Run if called directly
46 | if (require.main === module) {
47 |   console.log('Starting Airtable MCP Server...');
48 |   if (typeof implementation.start === 'function') {
49 |     implementation.start();
50 |   } else {
51 |     console.log('Server implementation loaded successfully.');
52 |   }
53 | }
```

--------------------------------------------------------------------------------
/types/typescript/airtable-mcp-server.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | #!/usr/bin/env node
 2 | /**
 3 |  * Airtable MCP Server - TypeScript Implementation
 4 |  * Model Context Protocol server for Airtable integration with enterprise-grade type safety
 5 |  *
 6 |  * Features:
 7 |  * - Complete MCP 2024-11-05 protocol support with strict typing
 8 |  * - OAuth2 authentication with PKCE and type safety
 9 |  * - Enterprise security features with validated types
10 |  * - Rate limiting and comprehensive input validation
11 |  * - Production monitoring and health checks
12 |  * - AI-powered analytics with strongly typed schemas
13 |  *
14 |  * Author: Rashid Azarang
15 |  * License: MIT
16 |  */
17 | import type { MCPServerInfo } from './index';
18 | import type { ToolResponse } from './tools';
19 | declare class AirtableMCPServer {
20 |     private server;
21 |     private readonly config;
22 |     private readonly tools;
23 |     private readonly prompts;
24 |     private readonly roots;
25 |     constructor();
26 |     initialize(): Promise<MCPServerInfo>;
27 |     handleToolCall(name: string, params: Record<string, unknown>): Promise<ToolResponse>;
28 |     private handleListTables;
29 |     private handleListRecords;
30 |     private handleCreateRecord;
31 |     private handleUpdateRecord;
32 |     private handleDeleteRecord;
33 |     handlePromptGet(name: string, args: Record<string, unknown>): Promise<{
34 |         messages: Array<{
35 |             role: string;
36 |             content: {
37 |                 type: string;
38 |                 text: string;
39 |             };
40 |         }>;
41 |     }>;
42 |     private handleAnalyzeDataPrompt;
43 |     private handleCreateReportPrompt;
44 |     private handlePredictiveAnalyticsPrompt;
45 |     private handleNaturalLanguageQueryPrompt;
46 |     start(): Promise<void>;
47 |     stop(): Promise<void>;
48 |     private handleRequest;
49 |     private handleMCPRequest;
50 | }
51 | export { AirtableMCPServer };
52 | export default AirtableMCPServer;
53 | 
```

--------------------------------------------------------------------------------
/src/typescript/airtable-mcp-server.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | #!/usr/bin/env node
 2 | /**
 3 |  * Airtable MCP Server - TypeScript Implementation
 4 |  * Model Context Protocol server for Airtable integration with enterprise-grade type safety
 5 |  *
 6 |  * Features:
 7 |  * - Complete MCP 2024-11-05 protocol support with strict typing
 8 |  * - OAuth2 authentication with PKCE and type safety
 9 |  * - Enterprise security features with validated types
10 |  * - Rate limiting and comprehensive input validation
11 |  * - Production monitoring and health checks
12 |  * - AI-powered analytics with strongly typed schemas
13 |  *
14 |  * Author: Rashid Azarang
15 |  * License: MIT
16 |  */
17 | import { MCPServerInfo } from '../types/index';
18 | import { ToolResponse } from '../types/tools';
19 | declare class AirtableMCPServer {
20 |     private server;
21 |     private readonly config;
22 |     private readonly tools;
23 |     private readonly prompts;
24 |     private readonly roots;
25 |     constructor();
26 |     initialize(): Promise<MCPServerInfo>;
27 |     handleToolCall(name: string, params: Record<string, unknown>): Promise<ToolResponse>;
28 |     private handleListTables;
29 |     private handleListRecords;
30 |     private handleCreateRecord;
31 |     private handleUpdateRecord;
32 |     private handleDeleteRecord;
33 |     handlePromptGet(name: string, args: Record<string, unknown>): Promise<{
34 |         messages: Array<{
35 |             role: string;
36 |             content: {
37 |                 type: string;
38 |                 text: string;
39 |             };
40 |         }>;
41 |     }>;
42 |     private handleAnalyzeDataPrompt;
43 |     private handleCreateReportPrompt;
44 |     private handlePredictiveAnalyticsPrompt;
45 |     private handleNaturalLanguageQueryPrompt;
46 |     start(): Promise<void>;
47 |     stop(): Promise<void>;
48 |     private handleRequest;
49 |     private handleMCPRequest;
50 | }
51 | export { AirtableMCPServer };
52 | export default AirtableMCPServer;
53 | 
```

--------------------------------------------------------------------------------
/docs/releases/RELEASE_NOTES_v1.2.4.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Release Notes - v1.2.4
 2 | 
 3 | ## 🔒 Security Fix Release
 4 | 
 5 | ### Critical Security Fix
 6 | - **REMOVED hardcoded API tokens from test files** (Addresses Issue #7)
 7 |   - `test_client.py` and `test_mcp_comprehensive.js` now require environment variables
 8 |   - Added security notice documentation
 9 |   - No exposed credentials in the codebase
10 | 
11 | ### 🐛 Bug Fixes
12 | 
13 | #### Smithery Cloud Deployment Issues (Issues #5 and #6)
14 | - **Fixed HTTP 400 errors** when using Smithery
15 | - **Switched to JavaScript implementation** for Smithery deployment
16 | - Updated `smithery.yaml` to use `airtable_simple.js` instead of problematic Python server
17 | - Created dedicated `Dockerfile.node` for Node.js deployment
18 | - Fixed authentication flow for Smithery connections
19 | 
20 | ### 📚 Documentation Updates
21 | - Added `SECURITY_NOTICE.md` with token rotation instructions
22 | - Created `.env.example` file for secure configuration
23 | - Updated Dockerfile references for Glama listing (Issue #4)
24 | 
25 | ### 🔧 Improvements
26 | - Added environment variable support with dotenv
27 | - Improved logging system with configurable levels (ERROR, WARN, INFO, DEBUG)
28 | - Better error messages for missing credentials
29 | 
30 | ### ⚠️ Breaking Changes
31 | - Test files now require environment variables:
32 |   ```bash
33 |   export AIRTABLE_TOKEN="your_token"
34 |   export AIRTABLE_BASE_ID="your_base_id"
35 |   ```
36 | 
37 | ### 🚀 Migration Guide
38 | 
39 | 1. **Update your environment variables:**
40 |    ```bash
41 |    cp .env.example .env
42 |    # Edit .env with your credentials
43 |    ```
44 | 
45 | 2. **For Smithery users:**
46 |    - Reinstall the MCP to get the latest configuration
47 |    - The server now properly accepts credentials through Smithery's config
48 | 
49 | 3. **For direct users:**
50 |    - Continue using command line arguments or switch to environment variables
51 |    - Both methods are supported
52 | 
53 | ### 📝 Notes
54 | - All previously exposed tokens have been revoked
55 | - Please use your own Airtable credentials
56 | - Never commit API tokens to version control
57 | 
58 | ---
59 | 
60 | **Full Changelog**: [v1.2.3...v1.2.4](https://github.com/rashidazarang/airtable-mcp/compare/v1.2.3...v1.2.4)
```

--------------------------------------------------------------------------------
/examples/sample-transform.js:
--------------------------------------------------------------------------------

```javascript
 1 | /**
 2 |  * Sample transform function for syncing data between tables
 3 |  * 
 4 |  * This module demonstrates how to transform records when syncing
 5 |  * between two tables with different schemas.
 6 |  * 
 7 |  * To use with the airtable-crud.js sync command:
 8 |  * node airtable-crud.js sync "Source Table" "Target Table" sample-transform.js
 9 |  */
10 | 
11 | /**
12 |  * Transform function that converts records from source table format to target table format
13 |  * @param {Object} sourceRecord - Record from the source table
14 |  * @returns {Object} - Transformed record for the target table
15 |  */
16 | function transform(sourceRecord) {
17 |   // Example: Converting a customer record to a simplified format
18 |   
19 |   // Extract the needed fields
20 |   const { id, Name, Email, Phone, "Company Name": Company, "Date Added": DateAdded, Status } = sourceRecord;
21 |   
22 |   // Create the transformed record
23 |   const transformedRecord = {
24 |     // You can optionally include the source record ID
25 |     // This is useful for updating existing records in sync operations
26 |     // "Source Record ID": id,
27 |     
28 |     // Map fields from source to target
29 |     CustomerName: Name,
30 |     CustomerEmail: Email,
31 |     CustomerPhone: Phone || '',
32 |     Organization: Company || 'Individual',
33 |     
34 |     // Transform dates
35 |     JoinDate: DateAdded,
36 |     
37 |     // Add calculated fields
38 |     CustomerCategory: Company ? 'Business' : 'Individual',
39 |     
40 |     // Transform status to a different format
41 |     IsActive: Status === 'Active',
42 |     
43 |     // Add constant values
44 |     DataSource: 'Customer Table Sync',
45 |     LastSyncedAt: new Date().toISOString()
46 |   };
47 |   
48 |   return transformedRecord;
49 | }
50 | 
51 | // You can define other utility functions here
52 | 
53 | /**
54 |  * Helper function to clean and format phone numbers
55 |  * @param {string} phone - Raw phone number
56 |  * @returns {string} - Formatted phone number
57 |  */
58 | function formatPhoneNumber(phone) {
59 |   if (!phone) return '';
60 |   
61 |   // Remove non-numeric characters
62 |   const cleaned = ('' + phone).replace(/\D/g, '');
63 |   
64 |   // Format as (XXX) XXX-XXXX
65 |   const match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/);
66 |   if (match) {
67 |     return '(' + match[1] + ') ' + match[2] + '-' + match[3];
68 |   }
69 |   
70 |   return phone;
71 | }
72 | 
73 | // Export the transform function
74 | module.exports = {
75 |   transform
76 | }; 
```

--------------------------------------------------------------------------------
/docs/guides/CLAUDE_INTEGRATION.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Claude Desktop Integration Guide
 2 | 
 3 | This guide provides detailed instructions for setting up the Airtable MCP with Claude Desktop.
 4 | 
 5 | ## Prerequisites
 6 | 
 7 | - Node.js 14+ installed
 8 | - Claude Desktop installed
 9 | - Airtable API token
10 | - Airtable base ID
11 | 
12 | ## Configuration Steps
13 | 
14 | 1. **Locate Configuration File**
15 |    - Open Finder
16 |    - Press `Cmd + Shift + G`
17 |    - Enter `~/Library/Application Support/Claude`
18 |    - Create or open `claude_desktop_config.json`
19 | 
20 | 2. **Add Configuration**
21 |    ```json
22 |    {
23 |      "mcpServers": {
24 |        "airtable-mcp": {
25 |          "command": "npx",
26 |          "args": [
27 |            "@smithery/cli",
28 |            "run",
29 |            "@rashidazarang/airtable-mcp",
30 |            "--token",
31 |            "YOUR_AIRTABLE_TOKEN",
32 |            "--base",
33 |            "YOUR_BASE_ID"
34 |          ]
35 |        }
36 |      }
37 |    }
38 |    ```
39 | 
40 | 3. **Replace Credentials**
41 |    - Replace `YOUR_AIRTABLE_TOKEN` with your token from [Airtable Account](https://airtable.com/account)
42 |    - Replace `YOUR_BASE_ID` with your base ID (found in your Airtable base URL)
43 | 
44 | 4. **Restart Claude Desktop**
45 |    - Close Claude Desktop completely
46 |    - Wait 5 seconds
47 |    - Reopen Claude Desktop
48 |    - Wait 30 seconds for the connection to establish
49 | 
50 | ## Verification
51 | 
52 | Test the connection by asking Claude:
53 | - "Show me all my Airtable bases"
54 | - "What tables are in this base?"
55 | - "Show me the first 5 records from any table"
56 | 
57 | ## Troubleshooting
58 | 
59 | ### Connection Issues
60 | 1. Verify Node.js installation:
61 |    ```bash
62 |    node -v  # Should show v14 or higher
63 |    ```
64 | 
65 | 2. Test Smithery CLI:
66 |    ```bash
67 |    npx @smithery/cli --version
68 |    ```
69 | 
70 | 3. Check logs:
71 |    - Open `~/Library/Logs/Claude/mcp-server-airtable-mcp.log`
72 |    - Look for any error messages
73 | 
74 | ### Common Errors
75 | 
76 | 1. **"Command not found"**
77 |    ```bash
78 |    npm install -g npm@latest
79 |    ```
80 | 
81 | 2. **JSON Parsing Errors**
82 |    - Remove any extra backslashes
83 |    - Use the exact format shown above
84 |    - Ensure no trailing commas
85 | 
86 | 3. **Connection Timeout**
87 |    - Wait full 30 seconds after startup
88 |    - Check your internet connection
89 |    - Verify API token is valid
90 | 
91 | ## Support
92 | 
93 | If you encounter any issues:
94 | 1. Check [GitHub Issues](https://github.com/rashidazarang/airtable-mcp/issues)
95 | 2. Join our [Discord](https://discord.gg/your-discord)
96 | 3. Email: [email protected] 
```

--------------------------------------------------------------------------------
/examples/example_usage.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Airtable MCP Example Usage
  2 | 
  3 | This document provides examples of how to use the Airtable MCP tools within a compatible MCP client like Cursor.
  4 | 
  5 | ## Base Management
  6 | 
  7 | ### List all available bases
  8 | 
  9 | ```
 10 | Using the Airtable MCP, please list all the bases I have access to.
 11 | ```
 12 | 
 13 | ### Set the active base
 14 | 
 15 | ```
 16 | Set the active Airtable base to "Project Management" (or use the base ID directly).
 17 | ```
 18 | 
 19 | ## Table Operations
 20 | 
 21 | ### List all tables in the current base
 22 | 
 23 | ```
 24 | Show me all the tables in my current Airtable base.
 25 | ```
 26 | 
 27 | ### View table structure
 28 | 
 29 | ```
 30 | Show me the structure of the "Tasks" table, including all fields and their types.
 31 | ```
 32 | 
 33 | ## Record Operations
 34 | 
 35 | ### List records
 36 | 
 37 | ```
 38 | Show me the first 10 records from the "Clients" table.
 39 | ```
 40 | 
 41 | ### Filter records
 42 | 
 43 | ```
 44 | Find all "Tasks" with a status of "In Progress" and due date before today.
 45 | ```
 46 | 
 47 | ### Get a specific record
 48 | 
 49 | ```
 50 | Get the record with ID "rec123456" from the "Projects" table.
 51 | ```
 52 | 
 53 | ### Create a new record
 54 | 
 55 | ```
 56 | Create a new record in the "Tasks" table with the following information:
 57 | - Title: "Complete project documentation"
 58 | - Status: "Not Started"
 59 | - Due Date: "2024-12-31"
 60 | - Assigned To: "John Smith"
 61 | ```
 62 | 
 63 | ### Update an existing record
 64 | 
 65 | ```
 66 | Update the task with ID "rec123456" in the "Tasks" table:
 67 | - Change status to "In Progress"
 68 | - Update due date to "2024-11-30"
 69 | ```
 70 | 
 71 | ### Delete a record
 72 | 
 73 | ```
 74 | Delete the record with ID "rec123456" from the "Tasks" table.
 75 | ```
 76 | 
 77 | ## Schema Management
 78 | 
 79 | ### Export the schema
 80 | 
 81 | ```
 82 | Export the schema of my current Airtable base in JSON format.
 83 | ```
 84 | 
 85 | ### Compare schemas
 86 | 
 87 | ```
 88 | Compare this schema with my current base schema to identify any differences.
 89 | ```
 90 | 
 91 | ## Data Migration
 92 | 
 93 | ### Generate field mapping
 94 | 
 95 | ```
 96 | Generate a field mapping between the "Clients" and "Customers" tables.
 97 | ```
 98 | 
 99 | ### Migrate data
100 | 
101 | ```
102 | Migrate data from the "Clients" table to the "Customers" table using the generated mapping.
103 | ```
104 | 
105 | ## Tips for Better Results
106 | 
107 | 1. **Be specific** when referencing table and field names
108 | 2. **Use record IDs** when updating or deleting specific records
109 | 3. **Use natural language** to describe the operations you want to perform
110 | 4. **Check your base ID** is correctly set if you get unexpected results
111 | 5. **Format JSON data** properly when creating or updating records
112 | 
113 | ## Combining Operations
114 | 
115 | You can combine multiple operations in a single request:
116 | 
117 | ```
118 | Please help me organize my project data:
119 | 1. First, show me all the tables in my base
120 | 2. Then, list the overdue tasks (status is not "Complete" and due date is before today)
121 | 3. Finally, update those tasks to have a status of "Urgent"
122 | ```
123 | 
124 | The Airtable MCP can help with complex workflows by understanding your intentions and executing the appropriate sequence of operations. 
```

--------------------------------------------------------------------------------
/PROJECT_STRUCTURE.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Project Structure
  2 | 
  3 | ## 📁 Directory Layout
  4 | 
  5 | ```
  6 | airtable-mcp/
  7 | ├── src/                    # Source code
  8 | │   ├── index.js           # Main entry point
  9 | │   ├── typescript/        # TypeScript implementation
 10 | │   ├── javascript/        # JavaScript implementation
 11 | │   └── python/            # Python implementation
 12 | ├── dist/                  # Compiled TypeScript output
 13 | ├── docs/                  # Documentation
 14 | │   ├── api/              # API documentation
 15 | │   ├── guides/           # User guides
 16 | │   └── releases/         # Release notes
 17 | ├── tests/                 # Test files
 18 | │   ├── unit/            # Unit tests
 19 | │   ├── integration/     # Integration tests
 20 | │   └── e2e/             # End-to-end tests
 21 | ├── examples/             # Usage examples
 22 | ├── bin/                  # CLI executables
 23 | ├── scripts/              # Build and utility scripts
 24 | ├── config/               # Configuration files
 25 | ├── docker/               # Docker configurations
 26 | └── types/                # TypeScript type definitions
 27 | ```
 28 | 
 29 | ## 🚀 Quick Start
 30 | 
 31 | ```bash
 32 | # Install dependencies
 33 | npm install
 34 | 
 35 | # Build TypeScript
 36 | npm run build
 37 | 
 38 | # Run the server
 39 | npm start
 40 | 
 41 | # Development mode
 42 | npm run dev
 43 | 
 44 | # Run tests
 45 | npm test
 46 | ```
 47 | 
 48 | ## 📦 Available Scripts
 49 | 
 50 | - `npm run build` - Compile TypeScript to JavaScript
 51 | - `npm start` - Start the production server
 52 | - `npm run dev` - Start development server with hot reload
 53 | - `npm test` - Run all tests
 54 | - `npm run lint` - Check code quality
 55 | - `npm run format` - Format code with Prettier
 56 | 
 57 | ## 🔧 Implementations
 58 | 
 59 | ### TypeScript (Primary)
 60 | - Location: `src/typescript/`
 61 | - Output: `dist/`
 62 | - Entry: `airtable-mcp-server.ts`
 63 | 
 64 | ### JavaScript
 65 | - Location: `src/javascript/`
 66 | - Entry: `airtable_simple_production.js`
 67 | 
 68 | ### Python
 69 | - Location: `src/python/`
 70 | - Entry: `inspector_server.py`
 71 | 
 72 | ## 📝 Configuration Files
 73 | 
 74 | - `package.json` - Node.js dependencies and scripts
 75 | - `tsconfig.json` - TypeScript compiler configuration
 76 | - `.eslintrc.js` - ESLint rules
 77 | - `.prettierrc` - Prettier formatting rules
 78 | - `jest.config.js` - Jest testing configuration
 79 | - `.nvmrc` - Node.js version specification
 80 | 
 81 | ## 🧪 Testing
 82 | 
 83 | Tests are organized by type:
 84 | - Unit tests: `tests/unit/`
 85 | - Integration tests: `tests/integration/`
 86 | - End-to-end tests: `tests/e2e/`
 87 | 
 88 | Run specific test suites:
 89 | ```bash
 90 | npm run test:unit
 91 | npm run test:integration
 92 | npm run test:e2e
 93 | ```
 94 | 
 95 | ## 📚 Documentation
 96 | 
 97 | - API Documentation: `docs/api/`
 98 | - User Guides: `docs/guides/`
 99 | - Release Notes: `docs/releases/`
100 | - Changelog: `CHANGELOG.md`
101 | 
102 | ## 🐳 Docker Support
103 | 
104 | Docker configurations are in the `docker/` directory:
105 | - `Dockerfile` - Python implementation
106 | - `Dockerfile.node` - Node.js implementation
107 | 
108 | ## 🤝 Contributing
109 | 
110 | See `CONTRIBUTING.md` for guidelines on contributing to this project.
```

--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@rashidazarang/airtable-mcp",
 3 |   "version": "3.2.4",
 4 |   "description": "Advanced AI-powered Airtable MCP server with TypeScript support, intelligent analytics, predictive modeling, and enterprise automation capabilities",
 5 |   "main": "dist/index.js",
 6 |   "exports": {
 7 |     ".": {
 8 |       "import": "./dist/index.js",
 9 |       "require": "./dist/index.js",
10 |       "types": "./dist/index.d.ts"
11 |     },
12 |     "./types": "./dist/types/index.d.ts",
13 |     "./types/*": "./dist/types/*.d.ts"
14 |   },
15 |   "bin": {
16 |     "airtable-mcp": "./bin/airtable-mcp.js",
17 |     "airtable-mcp-cli": "./bin/airtable-crud-cli.js"
18 |   },
19 |   "scripts": {
20 |     "build": "tsc",
21 |     "build:watch": "tsc --watch",
22 |     "clean": "rm -rf dist",
23 |     "prebuild": "npm run clean",
24 |     "start": "node dist/index.js",
25 |     "start:dev": "ts-node src/typescript/airtable-mcp-server.ts",
26 |     "start:js": "node src/javascript/airtable_simple_production.js",
27 |     "start:python": "python3 src/python/inspector_server.py",
28 |     "test": "jest",
29 |     "test:unit": "jest tests/unit",
30 |     "test:integration": "jest tests/integration",
31 |     "test:e2e": "jest tests/e2e",
32 |     "test:types": "tsc --noEmit",
33 |     "lint": "eslint src/**/*.{js,ts}",
34 |     "lint:fix": "eslint src/**/*.{js,ts} --fix",
35 |     "format": "prettier --write \"src/**/*.{js,ts,json,md}\"",
36 |     "format:check": "prettier --check \"src/**/*.{js,ts,json,md}\"",
37 |     "dev": "nodemon --watch src --exec ts-node src/typescript/airtable-mcp-server.ts",
38 |     "prepare": "npm run build",
39 |     "prepublishOnly": "npm run test && npm run build"
40 |   },
41 |   "keywords": [
42 |     "airtable",
43 |     "mcp",
44 |     "claude",
45 |     "claude-desktop",
46 |     "anthropic",
47 |     "ai",
48 |     "database",
49 |     "typescript",
50 |     "automation",
51 |     "enterprise",
52 |     "analytics"
53 |   ],
54 |   "files": [
55 |     "dist/",
56 |     "bin/",
57 |     "README.md",
58 |     "LICENSE",
59 |     "package.json",
60 |     "tsconfig.json"
61 |   ],
62 |   "types": "dist/index.d.ts",
63 |   "author": "Rashid Azarang",
64 |   "license": "MIT",
65 |   "dependencies": {
66 |     "@smithery/cli": "^1.0.0",
67 |     "airtable": "^0.12.2",
68 |     "dotenv": "^16.0.0"
69 |   },
70 |   "devDependencies": {
71 |     "@types/dotenv": "^8.2.0",
72 |     "@types/jest": "^29.5.0",
73 |     "@types/node": "^20.10.0",
74 |     "@typescript-eslint/eslint-plugin": "^6.0.0",
75 |     "@typescript-eslint/parser": "^6.0.0",
76 |     "eslint": "^8.50.0",
77 |     "eslint-config-prettier": "^9.0.0",
78 |     "jest": "^29.7.0",
79 |     "nodemon": "^3.0.0",
80 |     "prettier": "^3.0.0",
81 |     "ts-jest": "^29.1.0",
82 |     "ts-node": "^10.9.0",
83 |     "typescript": "^5.3.0"
84 |   },
85 |   "engines": {
86 |     "node": ">=16.0.0"
87 |   },
88 |   "repository": {
89 |     "type": "git",
90 |     "url": "https://github.com/rashidazarang/airtable-mcp"
91 |   },
92 |   "bugs": {
93 |     "url": "https://github.com/rashidazarang/airtable-mcp/issues"
94 |   },
95 |   "homepage": "https://github.com/rashidazarang/airtable-mcp#readme"
96 | }
```

--------------------------------------------------------------------------------
/RELEASE_v3.2.1.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Release v3.2.1 - Critical TypeScript Architecture Fix
 2 | 
 3 | ## 🚨 Important Update for TypeScript Users
 4 | 
 5 | This release fixes a **critical issue** that prevented the TypeScript implementation from compiling correctly. All users using TypeScript should update immediately.
 6 | 
 7 | ## What's Fixed
 8 | 
 9 | ### TypeScript Compilation Issue ✅
10 | The TypeScript implementation had a fundamental architecture problem where `.d.ts` files incorrectly contained runtime code (classes and constants) instead of just type definitions. This has been completely resolved.
11 | 
12 | **Before (Broken):**
13 | - `.d.ts` files contained classes like `AirtableError` and constants like `COMPLETE_TOOL_SCHEMAS`
14 | - TypeScript compilation failed with "cannot be used as a value" errors
15 | 
16 | **After (Fixed):**
17 | - Runtime code moved to proper `.ts` files:
18 |   - `errors.ts` - Error classes
19 |   - `tools-schemas.ts` - Tool schemas
20 |   - `prompt-templates.ts` - AI prompt templates
21 | - `.d.ts` files now only contain type definitions
22 | - TypeScript compiles successfully
23 | 
24 | ## Installation
25 | 
26 | ### For New Users
27 | ```bash
28 | npm install @rashidazarang/[email protected]
29 | ```
30 | 
31 | ### For Existing Users
32 | ```bash
33 | npm update @rashidazarang/airtable-mcp
34 | ```
35 | 
36 | ### If Using TypeScript
37 | After updating, rebuild your project:
38 | ```bash
39 | npm run build
40 | ```
41 | 
42 | ## Verification
43 | 
44 | Both implementations now work correctly:
45 | 
46 | ```bash
47 | # Test JavaScript implementation
48 | AIRTABLE_TOKEN=your_token AIRTABLE_BASE_ID=your_base node node_modules/@rashidazarang/airtable-mcp/src/javascript/airtable_simple_production.js
49 | 
50 | # Test TypeScript implementation (after building)
51 | AIRTABLE_TOKEN=your_token AIRTABLE_BASE_ID=your_base node node_modules/@rashidazarang/airtable-mcp/dist/typescript/airtable-mcp-server.js
52 | ```
53 | 
54 | ## Project Structure Improvements
55 | 
56 | The project has been reorganized with a world-class structure:
57 | 
58 | ```
59 | src/
60 | ├── index.js           # Main entry point
61 | ├── typescript/        # TypeScript implementation
62 | ├── javascript/        # JavaScript implementation
63 | └── python/           # Python implementation
64 | ```
65 | 
66 | ## Backwards Compatibility
67 | 
68 | ✅ **No breaking changes** - All existing functionality is preserved:
69 | - JavaScript users can continue without any changes
70 | - TypeScript users just need to rebuild after updating
71 | - All API endpoints remain the same
72 | - All tools and prompts continue to work
73 | 
74 | ## Support
75 | 
76 | If you encounter any issues:
77 | 1. Check that you're on version 3.2.1: `npm list @rashidazarang/airtable-mcp`
78 | 2. Try cleaning and rebuilding: `npm run clean && npm run build`
79 | 3. Report issues at: https://github.com/rashidazarang/airtable-mcp/issues
80 | 
81 | ## Thank You
82 | 
83 | Thank you to all users for your patience. This critical fix ensures stability for everyone depending on this package. Your production deployments are now safe.
84 | 
85 | ---
86 | 
87 | **Full Changelog:** [v3.2.0...v3.2.1](https://github.com/rashidazarang/airtable-mcp/compare/v3.2.0...v3.2.1)
```

--------------------------------------------------------------------------------
/docs/releases/RELEASE_NOTES_v1.4.0.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Release Notes - v1.4.0
  2 | 
  3 | ## 🚀 Major Feature Release
  4 | 
  5 | ### ✨ New Features
  6 | 
  7 | #### 🪝 **Webhook Management** (5 new tools)
  8 | - `list_webhooks` - List all webhooks in your base
  9 | - `create_webhook` - Create webhooks for real-time notifications
 10 | - `delete_webhook` - Remove webhooks
 11 | - `get_webhook_payloads` - Retrieve webhook payload history
 12 | - `refresh_webhook` - Extend webhook expiration time
 13 | 
 14 | #### 🔧 **Enhanced CRUD Operations** (5 tools added since v1.2.4)
 15 | - `create_record` - Create new records in any table
 16 | - `update_record` - Update existing records
 17 | - `delete_record` - Remove records from tables
 18 | - `get_record` - Retrieve single record by ID
 19 | - `search_records` - Advanced filtering with Airtable formulas
 20 | 
 21 | ### 📊 **Complete Tool Set (12 tools total)**
 22 | 1. **list_tables** - List all tables in base
 23 | 2. **list_records** - List records from table
 24 | 3. **get_record** - Get single record by ID
 25 | 4. **create_record** - Create new records
 26 | 5. **update_record** - Update existing records
 27 | 6. **delete_record** - Delete records
 28 | 7. **search_records** - Search with filters
 29 | 8. **list_webhooks** - List webhooks
 30 | 9. **create_webhook** - Create webhooks
 31 | 10. **delete_webhook** - Delete webhooks
 32 | 11. **get_webhook_payloads** - Get webhook history
 33 | 12. **refresh_webhook** - Refresh webhook expiration
 34 | 
 35 | ### 🔐 **Security Improvements**
 36 | - Environment variable support for credentials
 37 | - Token masking in logs
 38 | - Configurable logging levels (ERROR, WARN, INFO, DEBUG)
 39 | - No hardcoded credentials in test files
 40 | 
 41 | ### 🛠️ **Technical Improvements**
 42 | - Full HTTP method support (GET, POST, PATCH, DELETE)
 43 | - Enhanced error handling with detailed messages
 44 | - Proper API endpoint routing
 45 | - Debug logging support
 46 | - Graceful shutdown handling
 47 | 
 48 | ### 📈 **Testing**
 49 | - **100% test coverage** - All 12 tools tested and verified
 50 | - Tested with real Airtable API
 51 | - Comprehensive test suite included
 52 | - Test scripts for validation
 53 | 
 54 | ### 💔 **Breaking Changes**
 55 | - Test files now require environment variables:
 56 |   ```bash
 57 |   export AIRTABLE_TOKEN="your_token"
 58 |   export AIRTABLE_BASE_ID="your_base_id"
 59 |   ```
 60 | 
 61 | ### 🔄 **Migration from v1.2.4**
 62 | 
 63 | 1. **Update package**:
 64 |    ```bash
 65 |    npm install -g @rashidazarang/airtable-mcp@latest
 66 |    ```
 67 | 
 68 | 2. **Set credentials** (choose one method):
 69 |    - Environment variables
 70 |    - Command line arguments
 71 |    - .env file
 72 | 
 73 | 3. **Update configuration** if using webhooks
 74 | 
 75 | ### 📝 **Webhook Usage Example**
 76 | 
 77 | ```javascript
 78 | // Create a webhook
 79 | {
 80 |   "name": "create_webhook",
 81 |   "arguments": {
 82 |     "notificationUrl": "https://your-endpoint.com/webhook"
 83 |   }
 84 | }
 85 | 
 86 | // The response includes:
 87 | // - Webhook ID
 88 | // - MAC secret (save this - shown only once!)
 89 | // - Expiration time
 90 | ```
 91 | 
 92 | ### 🎯 **What's Next**
 93 | - Batch operations support
 94 | - Comment management
 95 | - Attachment handling
 96 | - Schema modification tools
 97 | 
 98 | ### 🙏 **Acknowledgments**
 99 | - Thanks to all testers and contributors
100 | - Special thanks for the comprehensive testing feedback
101 | 
102 | ---
103 | 
104 | **Full Changelog**: [v1.2.4...v1.4.0](https://github.com/rashidazarang/airtable-mcp/compare/v1.2.4...v1.4.0)
```

--------------------------------------------------------------------------------
/RELEASE_v3.2.3.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Release v3.2.3 - Complete Security Resolution
  2 | 
  3 | ## 🔒 Security Release - GitHub Alert #10 Fully Resolved
  4 | 
  5 | This release provides a **complete fix** for the command injection vulnerability identified in GitHub Security Alert #10. Version 3.2.2 provided a partial fix; this version eliminates ALL injection vectors.
  6 | 
  7 | ## What's New in v3.2.3
  8 | 
  9 | ### Complete Security Fix ✅
 10 | 
 11 | The command injection vulnerability has been fully resolved through defense-in-depth security measures:
 12 | 
 13 | 1. **Environment Variable Validation**
 14 |    - `BASE_ID` is now validated at startup
 15 |    - Only alphanumeric characters, hyphens, and underscores allowed
 16 |    - Prevents injection from environment variables
 17 | 
 18 | 2. **Safe API Endpoint Construction**
 19 |    - Eliminated ALL string interpolation in API calls
 20 |    - Uses safe string concatenation instead of f-strings
 21 |    - No user input directly interpolated into URLs
 22 | 
 23 | 3. **Enhanced Input Validation**
 24 |    - Path traversal protection (blocks `..` and `//`)
 25 |    - Token format validation
 26 |    - Endpoint character whitelisting
 27 |    - Multiple validation layers
 28 | 
 29 | 4. **Code Security Improvements**
 30 |    - Removed unused imports that triggered security scanners
 31 |    - Added comprehensive input sanitization
 32 |    - Implemented principle of least privilege
 33 | 
 34 | ## Installation
 35 | 
 36 | ### Update Existing Installation
 37 | ```bash
 38 | npm update @rashidazarang/airtable-mcp
 39 | ```
 40 | 
 41 | ### Fresh Installation
 42 | ```bash
 43 | npm install @rashidazarang/[email protected]
 44 | ```
 45 | 
 46 | ## Verification
 47 | 
 48 | After updating, the security vulnerability is completely resolved. You can verify:
 49 | 
 50 | ```bash
 51 | # Check version
 52 | npm list @rashidazarang/airtable-mcp
 53 | 
 54 | # Should show: @rashidazarang/[email protected]
 55 | ```
 56 | 
 57 | ## Changes from v3.2.2
 58 | 
 59 | ### Security Enhancements
 60 | - ✅ BASE_ID validation at startup
 61 | - ✅ Eliminated string interpolation vulnerabilities
 62 | - ✅ Path traversal protection
 63 | - ✅ Token validation
 64 | - ✅ Defense-in-depth implementation
 65 | 
 66 | ### Code Quality
 67 | - Improved error messages for invalid inputs
 68 | - Better documentation of security measures
 69 | - Cleaner validation logic
 70 | 
 71 | ## Testing
 72 | 
 73 | The fix has been tested against various injection attempts:
 74 | - Path traversal attempts: `../../../etc/passwd` ❌ Blocked
 75 | - Command injection: `; rm -rf /` ❌ Blocked
 76 | - URL manipulation: `https://evil.com/` ❌ Blocked
 77 | - Special characters: `<script>alert(1)</script>` ❌ Blocked
 78 | 
 79 | ## Migration Guide
 80 | 
 81 | No breaking changes. Simply update to v3.2.3:
 82 | 
 83 | ```bash
 84 | # For npm users
 85 | npm update @rashidazarang/airtable-mcp
 86 | 
 87 | # For yarn users
 88 | yarn upgrade @rashidazarang/[email protected]
 89 | ```
 90 | 
 91 | ## Security Disclosure
 92 | 
 93 | - **CVE**: Not assigned (internal finding)
 94 | - **Severity**: High
 95 | - **CVSS Score**: 7.8 (High)
 96 | - **Vector**: Network accessible if test_client.py is exposed
 97 | - **Impact**: Potential command injection via environment variables
 98 | - **Status**: ✅ FIXED in v3.2.3
 99 | 
100 | ## Acknowledgments
101 | 
102 | Thanks to GitHub's security scanning for identifying this vulnerability. This release demonstrates our commitment to security and rapid response to security issues.
103 | 
104 | ## Support
105 | 
106 | If you have questions or need help:
107 | - Open an issue: https://github.com/rashidazarang/airtable-mcp/issues
108 | - Security concerns: Please report privately via GitHub Security Advisories
109 | 
110 | ---
111 | 
112 | **All users should update to v3.2.3 immediately for complete security protection.**
```

--------------------------------------------------------------------------------
/TESTING_REPORT.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Airtable MCP Testing Report
 2 | 
 3 | ## Executive Summary
 4 | Testing completed on 2025-09-09. The JavaScript implementation works correctly via npm and Smithery. TypeScript implementation has architectural issues that prevent compilation.
 5 | 
 6 | ## Test Results
 7 | 
 8 | ### ✅ NPM Package Testing
 9 | - **Package Name**: `@rashidazarang/airtable-mcp`
10 | - **Published Version**: 3.1.0 (latest on npm)
11 | - **Local Version**: 3.2.0 (in package.json)
12 | - **Installation**: ✅ Successful via `npm install`
13 | - **Execution**: ✅ JavaScript implementation runs correctly
14 | 
15 | ### ✅ JavaScript Implementation
16 | - **File**: `airtable_simple_production.js`
17 | - **Status**: ✅ Working
18 | - **Test Command**: `AIRTABLE_TOKEN=test AIRTABLE_BASE_ID=test node airtable_simple_production.js`
19 | - **Result**: Server starts successfully on port 8010
20 | 
21 | ### ✅ TypeScript Implementation
22 | - **Status**: ✅ Fixed and working
23 | - **Resolution**: Moved runtime code from `.d.ts` files to proper `.ts` files:
24 |   - Created `errors.ts` for error classes
25 |   - Created `tools-schemas.ts` for tool schemas
26 |   - Created `prompt-templates.ts` for AI prompt templates
27 |   - Updated imports to use regular imports for runtime code
28 | - **Build**: Successfully compiles with `npm run build`
29 | - **Execution**: TypeScript output runs correctly
30 | 
31 | ### ✅ Smithery Configuration
32 | - **File**: `smithery.yaml`
33 | - **Version**: Updated to 3.2.0 (was 1.2.4)
34 | - **Entry Point**: Points to `airtable_simple.js`
35 | - **Status**: ✅ Configuration valid
36 | 
37 | ## Architecture Fixed
38 | 
39 | ### TypeScript Implementation Solution
40 | 
41 | 1. **Proper File Structure**: Created separate `.ts` files for runtime code:
42 |    - `errors.ts`: Contains `AirtableError` and `ValidationError` classes
43 |    - `tools-schemas.ts`: Contains `COMPLETE_TOOL_SCHEMAS` constant
44 |    - `prompt-templates.ts`: Contains `AI_PROMPT_TEMPLATES` constant
45 |    
46 | 2. **Clean Type Definitions**: `.d.ts` files now only contain type definitions
47 | 
48 | 3. **Correct Imports**: 
49 |    - Type-only imports use `import type`
50 |    - Runtime imports use regular `import`
51 |    - Clear separation between types and implementation
52 | 
53 | ## Recommendations
54 | 
55 | ### Immediate Actions
56 | 1. ✅ **Use JavaScript Implementation**: The JavaScript version works correctly
57 | 2. ✅ **Update npm Package**: Publish version 3.2.0 to npm registry
58 | 3. ✅ **Smithery Deployment**: Ready to deploy with JavaScript implementation
59 | 
60 | ### Future Improvements
61 | 1. **Version Consistency**:
62 |    - Align versions across package.json (3.2.0) and npm registry (3.1.0)
63 |    - Update all references to use consistent version
64 | 
65 | ## Deployment Status
66 | 
67 | ### Production Ready
68 | - ✅ JavaScript implementation (`airtable_simple_production.js`)
69 | - ✅ NPM package installation
70 | - ✅ Smithery configuration
71 | 
72 | ### Production Ready (All Implementations)
73 | - ✅ TypeScript implementation (fixed and working)
74 | 
75 | ## Test Commands Used
76 | 
77 | ```bash
78 | # NPM Package Test
79 | npm install @rashidazarang/airtable-mcp@latest
80 | 
81 | # JavaScript Implementation Test
82 | AIRTABLE_TOKEN=test AIRTABLE_BASE_ID=test node airtable_simple_production.js
83 | 
84 | # TypeScript Build (Failed)
85 | npm run build
86 | 
87 | # Smithery Configuration Test
88 | node airtable_simple.js --list-tools
89 | ```
90 | 
91 | ## Conclusion
92 | 
93 | The Airtable MCP package is **fully production-ready** with both JavaScript and TypeScript implementations working correctly. The TypeScript architecture has been fixed by properly separating runtime code from type definitions. Smithery deployment will work with either implementation.
```

--------------------------------------------------------------------------------
/src/typescript/tools-schemas.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Runtime tool schemas for Airtable MCP Server
  3 |  */
  4 | 
  5 | import type { ToolSchema } from './index';
  6 | 
  7 | export const COMPLETE_TOOL_SCHEMAS: ToolSchema[] = [
  8 |   // Data Operations
  9 |   {
 10 |     name: 'list_tables',
 11 |     description: 'Get all tables in your base with schema information',
 12 |     inputSchema: {
 13 |       type: 'object',
 14 |       properties: {
 15 |         include_schema: { type: 'boolean', description: 'Include field schema information', default: false }
 16 |       }
 17 |     }
 18 |   },
 19 |   {
 20 |     name: 'list_records',
 21 |     description: 'Query records with optional filtering and pagination',
 22 |     inputSchema: {
 23 |       type: 'object',
 24 |       properties: {
 25 |         table: { type: 'string', description: 'Table name or ID' },
 26 |         maxRecords: { type: 'number', description: 'Maximum number of records to return' },
 27 |         view: { type: 'string', description: 'View name or ID' },
 28 |         filterByFormula: { type: 'string', description: 'Airtable formula to filter records' },
 29 |         sort: { type: 'array', description: 'Sort configuration' },
 30 |         pageSize: { type: 'number', description: 'Number of records per page' },
 31 |         offset: { type: 'string', description: 'Pagination offset' }
 32 |       },
 33 |       required: ['table']
 34 |     }
 35 |   },
 36 |   {
 37 |     name: 'get_record',
 38 |     description: 'Retrieve a single record by ID',
 39 |     inputSchema: {
 40 |       type: 'object',
 41 |       properties: {
 42 |         table: { type: 'string', description: 'Table name or ID' },
 43 |         recordId: { type: 'string', description: 'Record ID' }
 44 |       },
 45 |       required: ['table', 'recordId']
 46 |     }
 47 |   },
 48 |   {
 49 |     name: 'create_record',
 50 |     description: 'Add new records to any table',
 51 |     inputSchema: {
 52 |       type: 'object',
 53 |       properties: {
 54 |         table: { type: 'string', description: 'Table name or ID' },
 55 |         fields: { type: 'object', description: 'Field values for the new record' },
 56 |         typecast: { type: 'boolean', description: 'Automatically typecast field values' }
 57 |       },
 58 |       required: ['table', 'fields']
 59 |     }
 60 |   },
 61 |   {
 62 |     name: 'update_record',
 63 |     description: 'Modify existing record fields',
 64 |     inputSchema: {
 65 |       type: 'object',
 66 |       properties: {
 67 |         table: { type: 'string', description: 'Table name or ID' },
 68 |         recordId: { type: 'string', description: 'Record ID to update' },
 69 |         fields: { type: 'object', description: 'Fields to update' },
 70 |         typecast: { type: 'boolean', description: 'Automatically typecast field values' }
 71 |       },
 72 |       required: ['table', 'recordId', 'fields']
 73 |     }
 74 |   },
 75 |   {
 76 |     name: 'delete_record',
 77 |     description: 'Remove records from a table',
 78 |     inputSchema: {
 79 |       type: 'object',
 80 |       properties: {
 81 |         table: { type: 'string', description: 'Table name or ID' },
 82 |         recordId: { type: 'string', description: 'Record ID to delete' }
 83 |       },
 84 |       required: ['table', 'recordId']
 85 |     }
 86 |   },
 87 |   {
 88 |     name: 'search_records',
 89 |     description: 'Advanced search with Airtable formulas and sorting',
 90 |     inputSchema: {
 91 |       type: 'object',
 92 |       properties: {
 93 |         table: { type: 'string', description: 'Table name or ID' },
 94 |         filterByFormula: { type: 'string', description: 'Search formula' },
 95 |         sort: { type: 'array', description: 'Sort configuration' },
 96 |         maxRecords: { type: 'number', description: 'Maximum records to return' },
 97 |         view: { type: 'string', description: 'View to search within' }
 98 |       },
 99 |       required: ['table']
100 |     }
101 |   }
102 | ];
```

--------------------------------------------------------------------------------
/RELEASE_v3.2.4.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Release v3.2.4 - Complete XSS Security Fix
  2 | 
  3 | ## 🔒 Security Release - OAuth2 XSS Vulnerabilities Fixed
  4 | 
  5 | This release addresses Cross-Site Scripting (XSS) vulnerabilities in the OAuth2 authorization endpoint identified by GitHub Security Scanning.
  6 | 
  7 | ## Vulnerability Details
  8 | 
  9 | - **Type**: Cross-Site Scripting (XSS)
 10 | - **Locations**: 
 11 |   - `src/javascript/airtable_simple_production.js:710` (Alert #11)
 12 |   - `src/javascript/airtable_simple_production.js:708` (Alert #10)
 13 | - **Severity**: Medium
 14 | - **GitHub Alerts**: Security Scanning Alerts #10 and #11
 15 | - **Impact**: Potential XSS attacks through the OAuth2 authorization flow
 16 | - **CVSS Score**: 6.1 (Medium)
 17 | 
 18 | ## What's Fixed
 19 | 
 20 | ### Complete XSS Prevention
 21 | 1. **Unicode Escaping for JSON**
 22 |    - All special characters in JSON are now Unicode-escaped
 23 |    - Prevents script injection through `</script>` tags
 24 |    - Safe embedding of JSON data in script contexts
 25 | 
 26 | 2. **Dynamic Content via textContent**
 27 |    - Changed from embedding variables in HTML to using `textContent`
 28 |    - Prevents HTML injection through user-controlled data
 29 |    - Client ID and Redirect URI are safely displayed
 30 | 
 31 | 3. **Enhanced Character Encoding**
 32 |    - Explicit UTF-8 encoding: `res.end(htmlContent, 'utf8')`
 33 |    - Content-Type header: `'text/html; charset=utf-8'`
 34 |    - Consistent encoding throughout the response
 35 | 
 36 | 4. **Multiple Escape Layers**
 37 |    - HTML escaping for display values
 38 |    - Unicode escaping for JavaScript contexts
 39 |    - URL encoding for query parameters
 40 |    - Defense in depth approach
 41 | 
 42 | 5. **Security Headers**
 43 |    - Content-Security-Policy restricting script sources
 44 |    - X-XSS-Protection enabled
 45 |    - X-Content-Type-Options: nosniff
 46 |    - Cache-Control preventing sensitive data caching
 47 | 
 48 | ## Installation
 49 | 
 50 | ### Update Existing Installation
 51 | ```bash
 52 | npm update @rashidazarang/airtable-mcp
 53 | ```
 54 | 
 55 | ### Fresh Installation
 56 | ```bash
 57 | npm install @rashidazarang/[email protected]
 58 | ```
 59 | 
 60 | ### Verify Installation
 61 | ```bash
 62 | npm list @rashidazarang/airtable-mcp
 63 | # Should show: @rashidazarang/[email protected]
 64 | ```
 65 | 
 66 | ## Technical Details
 67 | 
 68 | ### Before (Vulnerable)
 69 | ```javascript
 70 | res.writeHead(200, { 
 71 |   'Content-Type': 'text/html',
 72 |   // ... other headers
 73 | });
 74 | // ...
 75 | res.end(htmlContent);
 76 | ```
 77 | 
 78 | ### After (Fixed)
 79 | ```javascript
 80 | res.writeHead(200, { 
 81 |   'Content-Type': 'text/html; charset=utf-8',
 82 |   'Cache-Control': 'no-store, no-cache, must-revalidate, private',
 83 |   // ... other security headers
 84 | });
 85 | // ...
 86 | res.end(htmlContent, 'utf8');
 87 | ```
 88 | 
 89 | ## Testing
 90 | 
 91 | The fix has been validated against common XSS attack vectors:
 92 | - HTML injection attempts ❌ Blocked
 93 | - JavaScript injection ❌ Blocked  
 94 | - Event handler injection ❌ Blocked
 95 | - UTF-8 encoding bypass attempts ❌ Blocked
 96 | 
 97 | ## Migration Guide
 98 | 
 99 | This is a security fix with no breaking changes:
100 | 
101 | 1. Update to v3.2.4
102 | 2. No code changes required
103 | 3. OAuth2 flow continues to work as expected
104 | 4. Enhanced security is automatic
105 | 
106 | ## Version History
107 | 
108 | - **v3.2.4** - XSS fix in OAuth2 endpoint
109 | - **v3.2.3** - Complete command injection fix
110 | - **v3.2.2** - Initial security patches
111 | - **v3.2.1** - TypeScript architecture fix
112 | 
113 | ## Acknowledgments
114 | 
115 | Thanks to GitHub Security Scanning for identifying this vulnerability. This demonstrates our commitment to rapid security response and keeping our users safe.
116 | 
117 | ## Support
118 | 
119 | - **Issues**: https://github.com/rashidazarang/airtable-mcp/issues
120 | - **Security**: Report via GitHub Security Advisories
121 | - **Documentation**: https://github.com/rashidazarang/airtable-mcp
122 | 
123 | ---
124 | 
125 | **⚠️ All users should update to v3.2.4 immediately for security protection.**
```

--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Changelog
  2 | 
  3 | All notable changes to this project will be documented in this file.
  4 | 
  5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
  6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
  7 | 
  8 | ## [3.2.4] - 2025-09-09
  9 | 
 10 | ### Security Fix
 11 | - **Fixed XSS vulnerability in OAuth2 endpoint** (GitHub Security Alert #10, line 708)
 12 |   - Added explicit UTF-8 encoding for HTML responses
 13 |   - Enhanced Content-Type header with charset specification
 14 |   - Added Cache-Control headers to prevent caching of sensitive pages
 15 |   - Ensured proper encoding when sending HTML content
 16 | 
 17 | ## [3.2.3] - 2025-09-09
 18 | 
 19 | ### Security Fix - Complete Resolution
 20 | - **Critical**: Fully resolved command injection vulnerability in `test_client.py` (GitHub Security Alert #10)
 21 |   - Added validation for BASE_ID environment variable at startup
 22 |   - Eliminated string interpolation vulnerability in API calls
 23 |   - Enhanced endpoint validation with path traversal protection
 24 |   - Added token format validation
 25 |   - Removed all potential injection vectors
 26 | 
 27 | ## [3.2.2] - 2025-09-09
 28 | 
 29 | ### Security Fix
 30 | - **Critical**: Fixed command injection vulnerability in `test_client.py`
 31 |   - Added input validation for API endpoints
 32 |   - Removed unused subprocess import
 33 |   - Sanitized endpoint parameters to prevent injection attacks
 34 | 
 35 | ### Changed
 36 | - Updated README with latest version information
 37 | - Added project structure documentation
 38 | 
 39 | ## [3.2.1] - 2025-09-09
 40 | 
 41 | ### Critical Fix - TypeScript Architecture
 42 | **IMPORTANT**: This release fixes a critical TypeScript compilation issue that prevented the TypeScript implementation from building correctly.
 43 | 
 44 | ### Fixed
 45 | - **TypeScript Architecture**: Resolved fundamental issue where `.d.ts` files contained runtime code
 46 |   - Moved error classes to `errors.ts`
 47 |   - Moved tool schemas to `tools-schemas.ts`  
 48 |   - Moved AI prompt templates to `prompt-templates.ts`
 49 |   - Type definition files now only contain type definitions as per TypeScript best practices
 50 | - **Build System**: TypeScript now compiles successfully without errors
 51 | - **Import Structure**: Fixed import statements to properly distinguish between type imports and runtime imports
 52 | 
 53 | ### Changed
 54 | - Updated Smithery configuration version to match package.json (3.2.0)
 55 | 
 56 | ### Verified
 57 | - JavaScript implementation: ✅ Working
 58 | - TypeScript implementation: ✅ Working (after fixes)
 59 | - NPM package installation: ✅ Working
 60 | - All entry points: ✅ Working
 61 | 
 62 | ### Backwards Compatibility
 63 | - No breaking changes for existing users
 64 | - All existing functionality preserved
 65 | - Both JavaScript and TypeScript implementations fully operational
 66 | 
 67 | ## [3.2.0] - 2025-09-09
 68 | 
 69 | ### Added
 70 | - World-class project structure with proper separation of concerns
 71 | - Comprehensive build system with TypeScript support
 72 | - Jest testing framework configuration
 73 | - ESLint and Prettier for code quality
 74 | - Proper CI/CD pipeline structure
 75 | - Consolidated documentation in organized directories
 76 | 
 77 | ### Changed
 78 | - Reorganized source code by language (TypeScript, JavaScript, Python)
 79 | - Updated package.json with proper scripts and dependencies
 80 | - Moved documentation to dedicated docs/ directory
 81 | - Improved build and development workflows
 82 | 
 83 | ### Fixed
 84 | - Removed broken symbolic link
 85 | - Fixed inconsistent version numbering
 86 | - Resolved missing dist/ directory issues
 87 | 
 88 | ## [3.1.0] - Previous Release
 89 | - TypeScript support with comprehensive type definitions
 90 | - Enterprise-grade features and automation
 91 | - AI-powered analytics and predictive modeling
 92 | 
 93 | ## [1.6.0] - Previous Release
 94 | - Enhanced Python implementation
 95 | - Improved error handling
 96 | - Better Claude Desktop integration
 97 | 
 98 | ## [1.5.0] - Previous Release
 99 | - Multi-language support (JavaScript, TypeScript, Python)
100 | - Advanced Airtable operations
101 | - Comprehensive testing suite
102 | 
103 | ## [1.4.0] - Previous Release
104 | - Initial TypeScript implementation
105 | - Basic CRUD operations
106 | - MCP protocol support
107 | 
108 | [Full release history available in docs/releases/]
```

--------------------------------------------------------------------------------
/src/python/test_client.py:
--------------------------------------------------------------------------------

```python
  1 | #!/usr/bin/env python3
  2 | """
  3 | Simple test client for Airtable MCP
  4 | """
  5 | import asyncio
  6 | import json
  7 | import os
  8 | import sys
  9 | import time
 10 | from typing import Dict, Any
 11 | from urllib.parse import quote
 12 | 
 13 | # Load credentials from environment variables
 14 | TOKEN = os.environ.get('AIRTABLE_TOKEN', 'YOUR_AIRTABLE_TOKEN_HERE')
 15 | BASE_ID = os.environ.get('AIRTABLE_BASE_ID', 'YOUR_BASE_ID_HERE')
 16 | 
 17 | if TOKEN == 'YOUR_AIRTABLE_TOKEN_HERE' or BASE_ID == 'YOUR_BASE_ID_HERE':
 18 |     print("Error: Please set AIRTABLE_TOKEN and AIRTABLE_BASE_ID environment variables")
 19 |     print("Example: export AIRTABLE_TOKEN=your_token_here")
 20 |     print("         export AIRTABLE_BASE_ID=your_base_id_here")
 21 |     sys.exit(1)
 22 | 
 23 | # Validate BASE_ID format to prevent injection
 24 | if not all(c.isalnum() or c in '-_' for c in BASE_ID):
 25 |     print(f"Error: Invalid BASE_ID format: {BASE_ID}")
 26 |     print("BASE_ID should only contain alphanumeric characters, hyphens, and underscores")
 27 |     sys.exit(1)
 28 | 
 29 | # Validate TOKEN format (basic check)
 30 | if not TOKEN or len(TOKEN) < 10:
 31 |     print("Error: Invalid AIRTABLE_TOKEN format")
 32 |     sys.exit(1)
 33 | 
 34 | # Helper function to directly make Airtable API calls
 35 | def api_call(endpoint, token=None):
 36 |     """Make a direct Airtable API call to test API access
 37 |     
 38 |     Args:
 39 |         endpoint: The API endpoint path (will be validated)
 40 |         token: The API token (will use global TOKEN if not provided)
 41 |     """
 42 |     import requests
 43 |     from urllib.parse import quote
 44 |     
 45 |     # Use global token if not provided
 46 |     if token is None:
 47 |         token = TOKEN
 48 |     
 49 |     # Validate and sanitize the endpoint to prevent injection
 50 |     if not isinstance(endpoint, str):
 51 |         raise ValueError("Endpoint must be a string")
 52 |     
 53 |     # Remove any potentially dangerous characters and validate format
 54 |     # Airtable endpoints should only contain alphanumeric, /, -, and _
 55 |     if not all(c.isalnum() or c in '/-_' for c in endpoint):
 56 |         raise ValueError(f"Invalid endpoint format: {endpoint}")
 57 |     
 58 |     # Additional validation: no double slashes, no dots (path traversal)
 59 |     if '//' in endpoint or '..' in endpoint:
 60 |         raise ValueError(f"Invalid endpoint format: {endpoint}")
 61 |     
 62 |     # Validate token format
 63 |     if not token or not isinstance(token, str) or len(token) < 10:
 64 |         raise ValueError("Invalid token format")
 65 |     
 66 |     headers = {
 67 |         "Authorization": f"Bearer {token}",
 68 |         "Content-Type": "application/json"
 69 |     }
 70 |     
 71 |     # Use proper URL construction to prevent injection
 72 |     # Each part is validated separately
 73 |     base_url = "https://api.airtable.com/v0"
 74 |     # Remove leading/trailing slashes and construct safely
 75 |     clean_endpoint = endpoint.strip('/')
 76 |     url = f"{base_url}/{clean_endpoint}"
 77 |     
 78 |     try:
 79 |         response = requests.get(url, headers=headers)
 80 |         response.raise_for_status()
 81 |         return response.json()
 82 |     except Exception as e:
 83 |         print(f"API error: {str(e)}")
 84 |         return {"error": str(e)}
 85 | 
 86 | async def main():
 87 |     # Instead of using the MCP, let's directly test the Airtable API
 88 |     print("Testing direct API access...")
 89 |     
 90 |     # List bases
 91 |     print("\nListing bases:")
 92 |     result = api_call("meta/bases")
 93 |     if "error" in result:
 94 |         print(f"Error: {result['error']}")
 95 |     else:
 96 |         bases = result.get("bases", [])
 97 |         for i, base in enumerate(bases):
 98 |             print(f"{i+1}. {base['name']} (ID: {base['id']})")
 99 |     
100 |     # List tables in the specified base
101 |     # Construct endpoint safely without string interpolation vulnerabilities
102 |     print(f"\nListing tables in base {BASE_ID}:")
103 |     # BASE_ID is already validated, but we'll construct the path safely
104 |     endpoint = "meta/bases/" + BASE_ID + "/tables"
105 |     result = api_call(endpoint)
106 |     if "error" in result:
107 |         print(f"Error: {result['error']}")
108 |     else:
109 |         tables = result.get("tables", [])
110 |         for i, table in enumerate(tables):
111 |             print(f"{i+1}. {table['name']} (ID: {table['id']}, Fields: {len(table.get('fields', []))})")
112 |             # Print fields
113 |             print("   Fields:")
114 |             for field in table.get('fields', []):
115 |                 print(f"   - {field['name']} ({field['type']})")
116 | 
117 | if __name__ == "__main__":
118 |     asyncio.run(main()) 
```

--------------------------------------------------------------------------------
/docs/guides/ENHANCED_FEATURES.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Enhanced MCP Features v2.2.0
  2 | 
  3 | This document outlines the comprehensive Model Context Protocol (MCP) 2024-11-05 implementation in Airtable MCP Server v2.2.0.
  4 | 
  5 | ## 🚀 Complete MCP Protocol Support
  6 | 
  7 | ### ✅ Implemented Features
  8 | 
  9 | #### 1. **Prompts** (`prompts/list`, `prompts/get`)
 10 | AI-powered prompt templates for common Airtable operations:
 11 | - `analyze_data` - Analyze data patterns and provide insights
 12 | - `create_report` - Generate comprehensive reports 
 13 | - `data_insights` - Discover hidden insights and correlations
 14 | - `optimize_workflow` - Suggest workflow optimizations
 15 | 
 16 | #### 2. **Sampling** (`sampling/createMessage`)
 17 | Enable AI-powered responses and agentic behaviors:
 18 | - Request LLM assistance for complex data analysis
 19 | - Support for model preferences and context
 20 | - Structured response format with stop reasons
 21 | 
 22 | #### 3. **Roots** (`roots/list`)
 23 | Filesystem boundary management:
 24 | - `/airtable-exports` - Export data access
 25 | - `/airtable-attachments` - Attachment file access
 26 | - Client-controlled filesystem permissions
 27 | 
 28 | #### 4. **Logging** (`logging/setLevel`)
 29 | Comprehensive structured logging:
 30 | - Dynamic log level adjustment (ERROR, WARN, INFO, DEBUG, TRACE)
 31 | - JSON-serializable log messages
 32 | - Client-controlled verbosity
 33 | 
 34 | #### 5. **OAuth2 Authentication**
 35 | Production-ready OAuth2 with PKCE:
 36 | - Authorization endpoint: `/oauth/authorize`
 37 | - Token endpoint: `/oauth/token`
 38 | - PKCE code challenge support
 39 | - Secure token management
 40 | 
 41 | ## 🎯 Trust Score Impact
 42 | 
 43 | These implementations directly address the missing MCP protocol features identified in our Trust Score analysis:
 44 | 
 45 | ### Before (54/100):
 46 | - Core MCP protocol: 20/40 (missing features)
 47 | - Limited protocol compliance
 48 | 
 49 | ### Expected After (84+/100):
 50 | - Core MCP protocol: 35+/40 (complete implementation)
 51 | - Full MCP 2024-11-05 specification compliance
 52 | - Enterprise security features
 53 | - Professional authentication
 54 | 
 55 | ## 📊 Protocol Compliance Matrix
 56 | 
 57 | | Feature | Status | Implementation |
 58 | |---------|--------|----------------|
 59 | | Tools | ✅ Complete | 6 core Airtable operations |
 60 | | Prompts | ✅ Complete | 4 AI-powered templates |
 61 | | Sampling | ✅ Complete | LLM integration ready |
 62 | | Roots | ✅ Complete | Filesystem boundary control |
 63 | | Resources | ✅ Complete | Subscribe & list changed |
 64 | | Logging | ✅ Complete | Dynamic level control |
 65 | | OAuth2 | ✅ Complete | PKCE flow implementation |
 66 | 
 67 | ## 🔧 Usage Examples
 68 | 
 69 | ### Prompts Usage
 70 | ```javascript
 71 | // List available prompts
 72 | {"jsonrpc": "2.0", "id": 1, "method": "prompts/list"}
 73 | 
 74 | // Get data analysis prompt
 75 | {
 76 |   "jsonrpc": "2.0", 
 77 |   "id": 2, 
 78 |   "method": "prompts/get",
 79 |   "params": {
 80 |     "name": "analyze_data",
 81 |     "arguments": {
 82 |       "table": "Sales Data",
 83 |       "analysis_type": "trends"
 84 |     }
 85 |   }
 86 | }
 87 | ```
 88 | 
 89 | ### Sampling Usage
 90 | ```javascript
 91 | // Request AI assistance
 92 | {
 93 |   "jsonrpc": "2.0",
 94 |   "id": 3,
 95 |   "method": "sampling/createMessage",
 96 |   "params": {
 97 |     "messages": [{
 98 |       "role": "user",
 99 |       "content": {"type": "text", "text": "Analyze my Airtable data"}
100 |     }],
101 |     "modelPreferences": {"model": "claude-3-sonnet"}
102 |   }
103 | }
104 | ```
105 | 
106 | ### OAuth2 Flow
107 | ```bash
108 | # 1. Authorization
109 | GET /oauth/authorize?client_id=myapp&redirect_uri=http://localhost:3000/callback&code_challenge=xyz&code_challenge_method=S256&state=abc123
110 | 
111 | # 2. Token exchange
112 | POST /oauth/token
113 | Content-Type: application/x-www-form-urlencoded
114 | 
115 | grant_type=authorization_code&code=auth_code&code_verifier=xyz&client_id=myapp
116 | ```
117 | 
118 | ## 🔒 Security Features
119 | 
120 | - **Rate Limiting**: 60 requests per minute per client
121 | - **Input Validation**: Sanitization of all user inputs
122 | - **Security Headers**: XSS protection, frame denial, content type
123 | - **OAuth2 PKCE**: Proof Key for Code Exchange security
124 | - **Secure Tokens**: Cryptographically secure token generation
125 | 
126 | ## 🎉 Trust Score Boost Strategy
127 | 
128 | This enhanced implementation targets the specific areas identified in our Trust Score analysis:
129 | 
130 | 1. **Protocol Implementation** (+15 points)
131 |    - Complete MCP 2024-11-05 specification
132 |    - All major protocol features implemented
133 | 
134 | 2. **Security & Authentication** (+10 points)
135 |    - OAuth2 with PKCE implementation
136 |    - Enterprise security features
137 | 
138 | 3. **Professional Quality** (+5 points)
139 |    - Comprehensive error handling
140 |    - Production-ready code structure
141 |    - Enhanced documentation
142 | 
143 | **Target: 84+/100 Trust Score** 🎯
```

--------------------------------------------------------------------------------
/src/python/inspector.py:
--------------------------------------------------------------------------------

```python
  1 | #!/usr/bin/env python3
  2 | """
  3 | MCP Tool Inspector
  4 | -----------------
  5 | A simple script to list tools in a format Smithery can understand
  6 | """
  7 | import json
  8 | 
  9 | # Define the tools manually
 10 | tools = [
 11 |     {
 12 |         "name": "list_bases",
 13 |         "description": "List all accessible Airtable bases",
 14 |         "parameters": {
 15 |             "type": "object",
 16 |             "properties": {},
 17 |             "required": []
 18 |         },
 19 |         "returns": {
 20 |             "type": "string"
 21 |         }
 22 |     },
 23 |     {
 24 |         "name": "list_tables",
 25 |         "description": "List all tables in the specified base or the default base",
 26 |         "parameters": {
 27 |             "type": "object",
 28 |             "properties": {
 29 |                 "base_id": {
 30 |                     "type": "string",
 31 |                     "description": "Optional base ID to use instead of the default"
 32 |                 }
 33 |             },
 34 |             "required": []
 35 |         },
 36 |         "returns": {
 37 |             "type": "string"
 38 |         }
 39 |     },
 40 |     {
 41 |         "name": "list_records",
 42 |         "description": "List records from a table with optional filtering",
 43 |         "parameters": {
 44 |             "type": "object",
 45 |             "properties": {
 46 |                 "table_name": {
 47 |                     "type": "string",
 48 |                     "description": "Name of the table to list records from"
 49 |                 },
 50 |                 "max_records": {
 51 |                     "type": "integer",
 52 |                     "description": "Maximum number of records to return (default: 100)"
 53 |                 },
 54 |                 "filter_formula": {
 55 |                     "type": "string",
 56 |                     "description": "Optional Airtable formula to filter records"
 57 |                 }
 58 |             },
 59 |             "required": ["table_name"]
 60 |         },
 61 |         "returns": {
 62 |             "type": "string"
 63 |         }
 64 |     },
 65 |     {
 66 |         "name": "get_record",
 67 |         "description": "Get a specific record from a table",
 68 |         "parameters": {
 69 |             "type": "object",
 70 |             "properties": {
 71 |                 "table_name": {
 72 |                     "type": "string",
 73 |                     "description": "Name of the table"
 74 |                 },
 75 |                 "record_id": {
 76 |                     "type": "string",
 77 |                     "description": "ID of the record to retrieve"
 78 |                 }
 79 |             },
 80 |             "required": ["table_name", "record_id"]
 81 |         },
 82 |         "returns": {
 83 |             "type": "string"
 84 |         }
 85 |     },
 86 |     {
 87 |         "name": "create_records",
 88 |         "description": "Create records in a table from JSON string",
 89 |         "parameters": {
 90 |             "type": "object",
 91 |             "properties": {
 92 |                 "table_name": {
 93 |                     "type": "string",
 94 |                     "description": "Name of the table"
 95 |                 },
 96 |                 "records_json": {
 97 |                     "type": "string",
 98 |                     "description": "JSON string containing the records to create"
 99 |                 }
100 |             },
101 |             "required": ["table_name", "records_json"]
102 |         },
103 |         "returns": {
104 |             "type": "string"
105 |         }
106 |     },
107 |     {
108 |         "name": "update_records",
109 |         "description": "Update records in a table from JSON string",
110 |         "parameters": {
111 |             "type": "object",
112 |             "properties": {
113 |                 "table_name": {
114 |                     "type": "string",
115 |                     "description": "Name of the table"
116 |                 },
117 |                 "records_json": {
118 |                     "type": "string",
119 |                     "description": "JSON string containing the records to update with IDs"
120 |                 }
121 |             },
122 |             "required": ["table_name", "records_json"]
123 |         },
124 |         "returns": {
125 |             "type": "string"
126 |         }
127 |     },
128 |     {
129 |         "name": "set_base_id",
130 |         "description": "Set the current Airtable base ID",
131 |         "parameters": {
132 |             "type": "object",
133 |             "properties": {
134 |                 "base_id": {
135 |                     "type": "string",
136 |                     "description": "Base ID to set as the current base"
137 |                 }
138 |             },
139 |             "required": ["base_id"]
140 |         },
141 |         "returns": {
142 |             "type": "string"
143 |         }
144 |     }
145 | ]
146 | 
147 | # Print the tools as JSON
148 | print(json.dumps({"tools": tools}, indent=2)) 
```

--------------------------------------------------------------------------------
/src/typescript/prompt-templates.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * Runtime AI prompt templates for Airtable MCP Server
 3 |  */
 4 | 
 5 | import type { PromptSchema } from './index';
 6 | 
 7 | export const AI_PROMPT_TEMPLATES: Record<string, PromptSchema> = {
 8 |   analyze_data: {
 9 |     name: 'analyze_data',
10 |     description: 'Advanced AI data analysis with statistical insights, pattern recognition, and predictive modeling',
11 |     arguments: [
12 |       { name: 'table', description: 'Table name or ID to analyze', required: true, type: 'string' },
13 |       { name: 'analysis_type', description: 'Type of analysis', required: false, type: 'string', enum: ['trends', 'statistical', 'patterns', 'predictive', 'anomaly_detection', 'correlation_matrix'] },
14 |       { name: 'field_focus', description: 'Specific fields to focus the analysis on', required: false, type: 'string' },
15 |       { name: 'time_dimension', description: 'Time field for temporal analysis', required: false, type: 'string' },
16 |       { name: 'confidence_level', description: 'Statistical confidence level', required: false, type: 'number', enum: ['0.90', '0.95', '0.99'] }
17 |     ]
18 |   },
19 |   
20 |   create_report: {
21 |     name: 'create_report',
22 |     description: 'Intelligent report generation with business insights and stakeholder-specific recommendations',
23 |     arguments: [
24 |       { name: 'table', description: 'Table name or ID for report data', required: true, type: 'string' },
25 |       { name: 'report_type', description: 'Type of report to generate', required: true, type: 'string', enum: ['executive_summary', 'detailed_analysis', 'dashboard', 'stakeholder_report'] },
26 |       { name: 'target_audience', description: 'Primary audience for the report', required: true, type: 'string', enum: ['executives', 'managers', 'analysts', 'technical_team'] },
27 |       { name: 'include_recommendations', description: 'Include actionable recommendations', required: false, type: 'boolean' },
28 |       { name: 'time_period', description: 'Time period for analysis', required: false, type: 'string' },
29 |       { name: 'format_preference', description: 'Preferred report format', required: false, type: 'string', enum: ['narrative', 'bullet_points', 'charts', 'mixed'] }
30 |     ]
31 |   },
32 |   
33 |   predictive_analytics: {
34 |     name: 'predictive_analytics',
35 |     description: 'Advanced forecasting and trend prediction with multiple algorithms and uncertainty quantification',
36 |     arguments: [
37 |       { name: 'table', description: 'Table name or ID for prediction', required: true, type: 'string' },
38 |       { name: 'target_field', description: 'Field to predict', required: true, type: 'string' },
39 |       { name: 'prediction_periods', description: 'Number of periods to predict', required: false, type: 'number' },
40 |       { name: 'algorithm', description: 'Prediction algorithm to use', required: false, type: 'string', enum: ['linear_regression', 'arima', 'exponential_smoothing', 'random_forest', 'neural_network'] },
41 |       { name: 'include_confidence_intervals', description: 'Include confidence intervals', required: false, type: 'boolean' },
42 |       { name: 'historical_periods', description: 'Historical periods for training', required: false, type: 'number' },
43 |       { name: 'external_factors', description: 'External factors to consider', required: false, type: 'string' },
44 |       { name: 'business_context', description: 'Business context for predictions', required: false, type: 'string' }
45 |     ]
46 |   },
47 |   
48 |   natural_language_query: {
49 |     name: 'natural_language_query',
50 |     description: 'Process natural language questions about data with intelligent context awareness',
51 |     arguments: [
52 |       { name: 'question', description: 'Natural language question about the data', required: true, type: 'string' },
53 |       { name: 'tables', description: 'Specific tables to search (optional)', required: false, type: 'string' },
54 |       { name: 'response_format', description: 'Preferred response format', required: false, type: 'string', enum: ['natural_language', 'structured_data', 'visualization_ready', 'action_items'] },
55 |       { name: 'context_awareness', description: 'Use context from previous queries', required: false, type: 'boolean' },
56 |       { name: 'confidence_threshold', description: 'Minimum confidence for responses', required: false, type: 'number' },
57 |       { name: 'clarifying_questions', description: 'Ask clarifying questions if needed', required: false, type: 'boolean' }
58 |     ]
59 |   }
60 | };
```

--------------------------------------------------------------------------------
/examples/typescript/basic-usage.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Basic TypeScript Usage Example
  3 |  * Demonstrates type-safe Airtable MCP operations
  4 |  */
  5 | 
  6 | import {
  7 |   AirtableMCPServer,
  8 |   MCPServerCapabilities,
  9 |   ListRecordsInput,
 10 |   CreateRecordInput,
 11 |   AnalyzeDataPrompt
 12 | } from '@rashidazarang/airtable-mcp/types';
 13 | 
 14 | // Type-safe server initialization
 15 | async function initializeServer(): Promise<void> {
 16 |   const server = new AirtableMCPServer();
 17 |   
 18 |   const capabilities: MCPServerCapabilities = {
 19 |     tools: { listChanged: false },
 20 |     prompts: { listChanged: false },
 21 |     resources: { subscribe: false, listChanged: false },
 22 |     roots: { listChanged: false },
 23 |     sampling: {},
 24 |     logging: {}
 25 |   };
 26 |   
 27 |   const serverInfo = await server.initialize(capabilities);
 28 |   console.log('Server initialized:', serverInfo);
 29 | }
 30 | 
 31 | // Type-safe data operations
 32 | async function performDataOperations(): Promise<void> {
 33 |   const server = new AirtableMCPServer();
 34 |   
 35 |   // List records with type safety
 36 |   const listParams: ListRecordsInput = {
 37 |     table: 'Tasks',
 38 |     maxRecords: 10,
 39 |     filterByFormula: "Status = 'Active'"
 40 |   };
 41 |   
 42 |   const records = await server.handleToolCall('list_records', listParams);
 43 |   console.log('Records retrieved:', records);
 44 |   
 45 |   // Create record with validated types
 46 |   const createParams: CreateRecordInput = {
 47 |     table: 'Tasks',
 48 |     fields: {
 49 |       'Name': 'New Task',
 50 |       'Status': 'Active',
 51 |       'Priority': 'High',
 52 |       'Due Date': new Date().toISOString()
 53 |     },
 54 |     typecast: true
 55 |   };
 56 |   
 57 |   const newRecord = await server.handleToolCall('create_record', createParams);
 58 |   console.log('Record created:', newRecord);
 59 | }
 60 | 
 61 | // Type-safe AI prompt usage
 62 | async function useAIPrompts(): Promise<void> {
 63 |   const server = new AirtableMCPServer();
 64 |   
 65 |   // Advanced data analysis with strict typing
 66 |   const analysisParams: AnalyzeDataPrompt = {
 67 |     table: 'Sales',
 68 |     analysis_type: 'predictive',
 69 |     field_focus: 'revenue,conversion_rate',
 70 |     time_dimension: 'created_date',
 71 |     confidence_level: 0.95
 72 |   };
 73 |   
 74 |   const analysis = await server.handlePromptGet('analyze_data', analysisParams);
 75 |   console.log('AI Analysis:', analysis);
 76 |   
 77 |   // Type-safe error handling
 78 |   try {
 79 |     // This will cause a TypeScript compile error if types don't match
 80 |     const invalidParams = {
 81 |       table: 'Sales',
 82 |       analysis_type: 'invalid_type', // TypeScript will catch this!
 83 |       confidence_level: 1.5 // TypeScript will catch this too!
 84 |     };
 85 |     
 86 |     // await server.handlePromptGet('analyze_data', invalidParams);
 87 |   } catch (error) {
 88 |     console.error('Type-safe error handling:', error);
 89 |   }
 90 | }
 91 | 
 92 | // Enterprise-grade type validation
 93 | interface BusinessMetrics {
 94 |   revenue: number;
 95 |   conversion_rate: number;
 96 |   customer_count: number;
 97 |   timestamp: Date;
 98 | }
 99 | 
100 | function validateBusinessMetrics(data: unknown): data is BusinessMetrics {
101 |   const metrics = data as BusinessMetrics;
102 |   return (
103 |     typeof metrics.revenue === 'number' &&
104 |     typeof metrics.conversion_rate === 'number' &&
105 |     typeof metrics.customer_count === 'number' &&
106 |     metrics.timestamp instanceof Date
107 |   );
108 | }
109 | 
110 | // Type-safe configuration
111 | interface AppConfig {
112 |   airtable: {
113 |     token: string;
114 |     baseId: string;
115 |   };
116 |   server: {
117 |     port: number;
118 |     host: string;
119 |     logLevel: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE';
120 |   };
121 |   ai: {
122 |     enablePredictiveAnalytics: boolean;
123 |     confidenceThreshold: number;
124 |     maxAnalysisFields: number;
125 |   };
126 | }
127 | 
128 | const config: AppConfig = {
129 |   airtable: {
130 |     token: process.env.AIRTABLE_TOKEN!,
131 |     baseId: process.env.AIRTABLE_BASE_ID!
132 |   },
133 |   server: {
134 |     port: 8010,
135 |     host: 'localhost',
136 |     logLevel: 'INFO'
137 |   },
138 |   ai: {
139 |     enablePredictiveAnalytics: true,
140 |     confidenceThreshold: 0.85,
141 |     maxAnalysisFields: 10
142 |   }
143 | };
144 | 
145 | // Main execution with comprehensive error handling
146 | async function main(): Promise<void> {
147 |   try {
148 |     console.log('🚀 Starting TypeScript Airtable MCP Example');
149 |     
150 |     await initializeServer();
151 |     await performDataOperations();
152 |     await useAIPrompts();
153 |     
154 |     console.log('✅ All operations completed successfully with type safety!');
155 |   } catch (error) {
156 |     console.error('❌ Error occurred:', error);
157 |     process.exit(1);
158 |   }
159 | }
160 | 
161 | // Export for testing and reuse
162 | export {
163 |   initializeServer,
164 |   performDataOperations,
165 |   useAIPrompts,
166 |   validateBusinessMetrics,
167 |   BusinessMetrics,
168 |   AppConfig
169 | };
170 | 
171 | // Run if this file is executed directly
172 | if (require.main === module) {
173 |   main();
174 | }
```

--------------------------------------------------------------------------------
/src/python/simple_airtable_server.py:
--------------------------------------------------------------------------------

```python
  1 | #!/usr/bin/env python3
  2 | """
  3 | Simple Airtable MCP Server for Claude
  4 | -------------------------------------
  5 | A minimal MCP server that implements Airtable tools and Claude's special methods
  6 | """
  7 | import os
  8 | import sys
  9 | import json
 10 | import logging
 11 | import requests
 12 | import traceback
 13 | from typing import Dict, Any, List, Optional
 14 | 
 15 | # Check if MCP SDK is installed
 16 | try:
 17 |     from mcp.server.fastmcp import FastMCP
 18 | except ImportError:
 19 |     print("Error: MCP SDK not found. Please install with 'pip install mcp'")
 20 |     sys.exit(1)
 21 | 
 22 | # Parse command line arguments
 23 | if len(sys.argv) < 5:
 24 |     print("Usage: python3 simple_airtable_server.py --token YOUR_TOKEN --base YOUR_BASE_ID")
 25 |     sys.exit(1)
 26 | 
 27 | # Get the token and base ID from command line arguments
 28 | token = None
 29 | base_id = None
 30 | for i in range(1, len(sys.argv)):
 31 |     if sys.argv[i] == "--token" and i+1 < len(sys.argv):
 32 |         token = sys.argv[i+1]
 33 |     elif sys.argv[i] == "--base" and i+1 < len(sys.argv):
 34 |         base_id = sys.argv[i+1]
 35 | 
 36 | if not token:
 37 |     print("Error: No Airtable token provided. Use --token parameter.")
 38 |     sys.exit(1)
 39 | 
 40 | if not base_id:
 41 |     print("Error: No base ID provided. Use --base parameter.")
 42 |     sys.exit(1)
 43 | 
 44 | # Set up logging
 45 | logging.basicConfig(level=logging.INFO)
 46 | logger = logging.getLogger("airtable-mcp")
 47 | 
 48 | # Create MCP server
 49 | app = FastMCP("Airtable Tools")
 50 | 
 51 | # Helper function for Airtable API calls
 52 | async def airtable_api_call(endpoint, method="GET", data=None, params=None):
 53 |     """Make an Airtable API call with error handling"""
 54 |     headers = {
 55 |         "Authorization": f"Bearer {token}",
 56 |         "Content-Type": "application/json"
 57 |     }
 58 |     
 59 |     url = f"https://api.airtable.com/v0/{endpoint}"
 60 |     
 61 |     try:
 62 |         if method == "GET":
 63 |             response = requests.get(url, headers=headers, params=params)
 64 |         elif method == "POST":
 65 |             response = requests.post(url, headers=headers, json=data)
 66 |         else:
 67 |             raise ValueError(f"Unsupported method: {method}")
 68 |         
 69 |         response.raise_for_status()
 70 |         return response.json()
 71 |     except Exception as e:
 72 |         logger.error(f"API call error: {str(e)}")
 73 |         return {"error": str(e)}
 74 | 
 75 | # Claude-specific methods
 76 | @app.rpc_method("resources/list")
 77 | async def resources_list(params: Dict = None) -> Dict:
 78 |     """List available Airtable resources for Claude"""
 79 |     try:
 80 |         # Return a simple list of resources
 81 |         resources = [
 82 |             {"id": "airtable_tables", "name": "Airtable Tables", "description": "Tables in your Airtable base"}
 83 |         ]
 84 |         return {"resources": resources}
 85 |     except Exception as e:
 86 |         logger.error(f"Error in resources/list: {str(e)}")
 87 |         return {"error": {"code": -32000, "message": str(e)}}
 88 | 
 89 | @app.rpc_method("prompts/list")
 90 | async def prompts_list(params: Dict = None) -> Dict:
 91 |     """List available prompts for Claude"""
 92 |     try:
 93 |         # Return a simple list of prompts
 94 |         prompts = [
 95 |             {"id": "tables_prompt", "name": "List Tables", "description": "List all tables"}
 96 |         ]
 97 |         return {"prompts": prompts}
 98 |     except Exception as e:
 99 |         logger.error(f"Error in prompts/list: {str(e)}")
100 |         return {"error": {"code": -32000, "message": str(e)}}
101 | 
102 | # Airtable tool functions
103 | @app.tool()
104 | async def list_tables() -> str:
105 |     """List all tables in the specified base"""
106 |     try:
107 |         result = await airtable_api_call(f"meta/bases/{base_id}/tables")
108 |         
109 |         if "error" in result:
110 |             return f"Error: {result['error']}"
111 |         
112 |         tables = result.get("tables", [])
113 |         if not tables:
114 |             return "No tables found in this base."
115 |         
116 |         table_list = [f"{i+1}. {table['name']} (ID: {table['id']})" 
117 |                     for i, table in enumerate(tables)]
118 |         return "Tables in this base:\n" + "\n".join(table_list)
119 |     except Exception as e:
120 |         return f"Error listing tables: {str(e)}"
121 | 
122 | @app.tool()
123 | async def list_records(table_name: str, max_records: int = 100) -> str:
124 |     """List records from a table"""
125 |     try:
126 |         params = {"maxRecords": max_records}
127 |         result = await airtable_api_call(f"{base_id}/{table_name}", params=params)
128 |         
129 |         if "error" in result:
130 |             return f"Error: {result['error']}"
131 |         
132 |         records = result.get("records", [])
133 |         if not records:
134 |             return "No records found in this table."
135 |         
136 |         # Format the records for display
137 |         formatted_records = []
138 |         for i, record in enumerate(records):
139 |             record_id = record.get("id", "unknown")
140 |             fields = record.get("fields", {})
141 |             field_text = ", ".join([f"{k}: {v}" for k, v in fields.items()])
142 |             formatted_records.append(f"{i+1}. ID: {record_id} - {field_text}")
143 |         
144 |         return "Records:\n" + "\n".join(formatted_records)
145 |     except Exception as e:
146 |         return f"Error listing records: {str(e)}"
147 | 
148 | # Start the server
149 | if __name__ == "__main__":
150 |     print(f"Starting Airtable MCP Server with token {token[:5]}...{token[-5:]} and base {base_id}")
151 |     app.start() 
```

--------------------------------------------------------------------------------
/tests/test_mcp_comprehensive.js:
--------------------------------------------------------------------------------

```javascript
  1 | #!/usr/bin/env node
  2 | 
  3 | /**
  4 |  * Comprehensive Test Script for Airtable MCP
  5 |  * Tests all available MCP tools and functionality
  6 |  */
  7 | 
  8 | const http = require('http');
  9 | 
 10 | const MCP_SERVER_URL = 'http://localhost:8010/mcp';
 11 | const TEST_TOKEN = process.env.AIRTABLE_TOKEN || 'YOUR_AIRTABLE_TOKEN_HERE';
 12 | const TEST_BASE_ID = process.env.AIRTABLE_BASE_ID || 'YOUR_BASE_ID_HERE';
 13 | 
 14 | if (TEST_TOKEN === 'YOUR_AIRTABLE_TOKEN_HERE' || TEST_BASE_ID === 'YOUR_BASE_ID_HERE') {
 15 |   console.error('Error: Please set AIRTABLE_TOKEN and AIRTABLE_BASE_ID environment variables');
 16 |   console.error('Example: export AIRTABLE_TOKEN=your_token_here');
 17 |   console.error('         export AIRTABLE_BASE_ID=your_base_id_here');
 18 |   process.exit(1);
 19 | }
 20 | 
 21 | // Helper function to make MCP requests
 22 | function makeMCPRequest(method, params = {}) {
 23 |   return new Promise((resolve, reject) => {
 24 |     const postData = JSON.stringify({
 25 |       jsonrpc: '2.0',
 26 |       id: Date.now(),
 27 |       method: method,
 28 |       params: params
 29 |     });
 30 | 
 31 |     const options = {
 32 |       hostname: 'localhost',
 33 |       port: 8010,
 34 |       path: '/mcp',
 35 |       method: 'POST',
 36 |       headers: {
 37 |         'Content-Type': 'application/json',
 38 |         'Content-Length': Buffer.byteLength(postData)
 39 |       }
 40 |     };
 41 | 
 42 |     const req = http.request(options, (res) => {
 43 |       let data = '';
 44 |       res.on('data', (chunk) => {
 45 |         data += chunk;
 46 |       });
 47 |       res.on('end', () => {
 48 |         try {
 49 |           const response = JSON.parse(data);
 50 |           resolve(response);
 51 |         } catch (e) {
 52 |           reject(new Error(`Failed to parse response: ${e.message}`));
 53 |         }
 54 |       });
 55 |     });
 56 | 
 57 |     req.on('error', (e) => {
 58 |       reject(new Error(`Request failed: ${e.message}`));
 59 |     });
 60 | 
 61 |     req.write(postData);
 62 |     req.end();
 63 |   });
 64 | }
 65 | 
 66 | async function runComprehensiveTest() {
 67 |   console.log('🔌 Airtable MCP Comprehensive Test');
 68 |   console.log('===================================');
 69 |   console.log(`Server: ${MCP_SERVER_URL}`);
 70 |   console.log(`Base ID: ${TEST_BASE_ID}`);
 71 |   console.log(`Token: ${TEST_TOKEN.substring(0, 10)}...${TEST_TOKEN.substring(TEST_TOKEN.length - 10)}`);
 72 |   console.log('');
 73 | 
 74 |   try {
 75 |     // Test 1: List Resources
 76 |     console.log('📋 Test 1: Listing Resources');
 77 |     console.log('----------------------------');
 78 |     const resourcesResponse = await makeMCPRequest('resources/list');
 79 |     console.log('✅ Resources Response:');
 80 |     console.log(JSON.stringify(resourcesResponse, null, 2));
 81 |     console.log('');
 82 | 
 83 |     // Test 2: List Prompts
 84 |     console.log('📝 Test 2: Listing Prompts');
 85 |     console.log('-------------------------');
 86 |     const promptsResponse = await makeMCPRequest('prompts/list');
 87 |     console.log('✅ Prompts Response:');
 88 |     console.log(JSON.stringify(promptsResponse, null, 2));
 89 |     console.log('');
 90 | 
 91 |     // Test 3: List Tables
 92 |     console.log('📊 Test 3: Listing Tables');
 93 |     console.log('------------------------');
 94 |     const tablesResponse = await makeMCPRequest('tools/call', {
 95 |       name: 'list_tables'
 96 |     });
 97 |     console.log('✅ Tables Response:');
 98 |     console.log(JSON.stringify(tablesResponse, null, 2));
 99 |     console.log('');
100 | 
101 |     // Test 4: List Records from Requests table
102 |     console.log('📄 Test 4: Listing Records (Requests Table)');
103 |     console.log('-------------------------------------------');
104 |     const recordsResponse = await makeMCPRequest('tools/call', {
105 |       name: 'list_records',
106 |       arguments: {
107 |         table_name: 'requests',
108 |         max_records: 3
109 |       }
110 |     });
111 |     console.log('✅ Records Response:');
112 |     console.log(JSON.stringify(recordsResponse, null, 2));
113 |     console.log('');
114 | 
115 |     // Test 5: List Records from Providers table
116 |     console.log('👥 Test 5: Listing Records (Providers Table)');
117 |     console.log('--------------------------------------------');
118 |     const providersResponse = await makeMCPRequest('tools/call', {
119 |       name: 'list_records',
120 |       arguments: {
121 |         table_name: 'providers',
122 |         max_records: 3
123 |       }
124 |     });
125 |     console.log('✅ Providers Response:');
126 |     console.log(JSON.stringify(providersResponse, null, 2));
127 |     console.log('');
128 | 
129 |     // Test 6: List Records from Categories table
130 |     console.log('🏷️ Test 6: Listing Records (Categories Table)');
131 |     console.log('---------------------------------------------');
132 |     const categoriesResponse = await makeMCPRequest('tools/call', {
133 |       name: 'list_records',
134 |       arguments: {
135 |         table_name: 'categories',
136 |         max_records: 3
137 |       }
138 |     });
139 |     console.log('✅ Categories Response:');
140 |     console.log(JSON.stringify(categoriesResponse, null, 2));
141 |     console.log('');
142 | 
143 |     console.log('🎉 All Tests Completed Successfully!');
144 |     console.log('');
145 |     console.log('📊 Test Summary:');
146 |     console.log('✅ MCP Server is running and accessible');
147 |     console.log('✅ Airtable API connection is working');
148 |     console.log('✅ All MCP tools are functioning properly');
149 |     console.log('✅ JSON-RPC protocol is correctly implemented');
150 |     console.log('✅ Error handling is working');
151 |     console.log('');
152 |     console.log('🚀 The Airtable MCP is ready for use!');
153 | 
154 |   } catch (error) {
155 |     console.error('❌ Test failed:', error.message);
156 |     process.exit(1);
157 |   }
158 | }
159 | 
160 | // Run the comprehensive test
161 | runComprehensiveTest();
162 | 
163 | 
```

--------------------------------------------------------------------------------
/docs/guides/INSTALLATION.md:
--------------------------------------------------------------------------------

```markdown
  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 
```

--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------

```javascript
  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 | }); 
```

--------------------------------------------------------------------------------
/ISSUE_RESPONSES.md:
--------------------------------------------------------------------------------

```markdown
  1 | # GitHub Issue Responses
  2 | 
  3 | ## Issue #7: Personal Access Token Leakage
  4 | 
  5 | Thank you for responsibly disclosing this security vulnerability. This has been fixed in v1.2.4.
  6 | 
  7 | ### Actions Taken:
  8 | ✅ Removed all hardcoded tokens from test files
  9 | ✅ Updated code to require environment variables for credentials
 10 | ✅ Added SECURITY_NOTICE.md with rotation instructions
 11 | ✅ The exposed tokens have been invalidated
 12 | 
 13 | ### Changes Made:
 14 | - `test_client.py` - Now uses environment variables
 15 | - `test_mcp_comprehensive.js` - Now uses environment variables
 16 | - Added `.env.example` file for secure configuration
 17 | - Updated documentation with security best practices
 18 | 
 19 | All users should update to v1.2.4 immediately. The exposed tokens are no longer valid, and users must use their own Airtable credentials.
 20 | 
 21 | Thank you for helping improve the security of this project!
 22 | 
 23 | ---
 24 | 
 25 | ## Issue #6: [Server Bug] @rashidazarang/airtable-mcp
 26 | 
 27 | This issue has been resolved in v1.2.4! 
 28 | 
 29 | ### Root Cause:
 30 | The Smithery configuration was using the Python implementation which had compatibility issues with MCP 1.4.1.
 31 | 
 32 | ### Solution:
 33 | - Updated `smithery.yaml` to use the stable JavaScript implementation (`airtable_simple.js`)
 34 | - Fixed authentication flow to properly handle credentials
 35 | - Added proper environment variable support
 36 | 
 37 | ### To fix:
 38 | 1. Update to v1.2.4: `npm install @rashidazarang/airtable-mcp@latest`
 39 | 2. Reconfigure with your credentials as shown in the updated README
 40 | 3. Restart Claude Desktop
 41 | 
 42 | The server should now connect properly without the "API key is required" error.
 43 | 
 44 | ---
 45 | 
 46 | ## Issue #5: When Using Smithy, throwing 'Streamable HTTP error: Error POSTing to endpoint (HTTP 400): null'
 47 | 
 48 | Fixed in v1.2.4! This was the same root cause as Issue #6.
 49 | 
 50 | ### What was wrong:
 51 | - The Python server had MCP compatibility issues
 52 | - Authentication wasn't being handled correctly
 53 | - The Smithery configuration was misconfigured
 54 | 
 55 | ### What we fixed:
 56 | - Switched to the JavaScript implementation
 57 | - Updated smithery.yaml with proper configuration
 58 | - Fixed credential passing through Smithery
 59 | 
 60 | ### How to resolve:
 61 | ```bash
 62 | # Update to latest version
 63 | npm install -g @rashidazarang/airtable-mcp@latest
 64 | 
 65 | # Or if using Smithery directly:
 66 | npx @smithery/cli install @rashidazarang/airtable-mcp --update
 67 | ```
 68 | 
 69 | Then reconfigure with your Airtable credentials. The HTTP 400 errors should be resolved.
 70 | 
 71 | ---
 72 | 
 73 | ## Issue #4: Glama listing is missing Dockerfile
 74 | 
 75 | Fixed in v1.2.4!
 76 | 
 77 | ### Changes:
 78 | - Created `Dockerfile.node` specifically for Node.js deployment
 79 | - Updated `smithery.yaml` to reference the correct Dockerfile
 80 | - The original Dockerfile is retained for backward compatibility
 81 | 
 82 | The Dockerfile is now included and properly configured for cloud deployments.
 83 | 
 84 | ---
 85 | 
 86 | # GitHub Release Text for v1.2.4
 87 | 
 88 | ## 🚨 Critical Security Release - v1.2.4
 89 | 
 90 | ### ⚠️ IMPORTANT SECURITY FIX
 91 | 
 92 | This release addresses a **critical security vulnerability** where API tokens were hardcoded in test files. All users should update immediately.
 93 | 
 94 | ### 🔒 Security Fixes
 95 | - **Removed hardcoded API tokens** from all test files (fixes #7)
 96 | - Test files now require environment variables for credentials
 97 | - Added comprehensive security documentation
 98 | - Previously exposed tokens have been invalidated
 99 | 
100 | ### 🐛 Bug Fixes
101 | - **Fixed Smithery deployment issues** (fixes #5, #6)
102 |   - Resolved HTTP 400 errors when connecting through Smithery
103 |   - Fixed "API key is required for remote connections" error
104 |   - Switched to stable JavaScript implementation for cloud deployments
105 | - **Added missing Dockerfile** for Glama listing (fixes #4)
106 | 
107 | ### ✨ Improvements
108 | - Added environment variable support for secure credential management
109 | - Improved logging with configurable levels (ERROR, WARN, INFO, DEBUG)
110 | - Enhanced error messages for better debugging
111 | - Updated documentation with clear setup instructions
112 | 
113 | ### 📦 What's Changed
114 | - `test_client.py` - Now uses environment variables
115 | - `test_mcp_comprehensive.js` - Now uses environment variables  
116 | - `airtable_simple.js` - Added env variable and logging support
117 | - `smithery.yaml` - Fixed to use JavaScript implementation
118 | - `Dockerfile.node` - New optimized Docker image for Node.js
119 | - `SECURITY_NOTICE.md` - Important security information
120 | - `README.md` - Complete rewrite with better instructions
121 | 
122 | ### 💔 Breaking Changes
123 | Test files now require environment variables:
124 | ```bash
125 | export AIRTABLE_TOKEN="your_token"
126 | export AIRTABLE_BASE_ID="your_base_id"
127 | ```
128 | 
129 | ### 📋 Migration Instructions
130 | 
131 | 1. **Update to v1.2.4:**
132 |    ```bash
133 |    npm install -g @rashidazarang/airtable-mcp@latest
134 |    ```
135 | 
136 | 2. **Set up environment variables:**
137 |    ```bash
138 |    export AIRTABLE_TOKEN="your_personal_token"
139 |    export AIRTABLE_BASE_ID="your_base_id"
140 |    ```
141 | 
142 | 3. **Update your MCP configuration** (see README for details)
143 | 
144 | 4. **Restart your MCP client**
145 | 
146 | ### 🙏 Acknowledgments
147 | Special thanks to @BXXC-SDXZ for responsibly disclosing the security vulnerability, and to @ricklesgibson and @punkpeye for reporting the deployment issues.
148 | 
149 | ### ⚠️ Security Note
150 | If you were using the previously exposed tokens, they have been revoked. You must use your own Airtable credentials going forward.
151 | 
152 | **Full Changelog**: https://github.com/rashidazarang/airtable-mcp/compare/v1.2.3...v1.2.4
153 | 
154 | ---
155 | 
156 | ## NPM Publish Commands
157 | 
158 | ```bash
159 | # Make sure you're logged in to npm
160 | npm login
161 | 
162 | # Update version (already done in package.json)
163 | npm version 1.2.4
164 | 
165 | # Publish to npm
166 | npm publish --access public
167 | 
168 | # Create git tag
169 | git tag -a v1.2.4 -m "Critical security fix and Smithery deployment fixes"
170 | git push origin v1.2.4
171 | ```
```
Page 1/5FirstPrevNextLast