onimsha/airtable-mcp-server-oauth
If you are the rightful owner of airtable-mcp-server-oauth and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
Airtable OAuth MCP Server is a production-ready server that facilitates secure interactions with Airtable through a standardized Model Context Protocol (MCP) interface.
Airtable OAuth MCP Server
A production-ready Model Context Protocol (MCP) server for Airtable with secure OAuth 2.0 authentication. This server enables AI assistants and applications to interact with Airtable bases through a standardized MCP interface, providing complete API coverage for all Airtable operations.
๐ Features
Core Functionality
- ๐ OAuth 2.0 Authentication - Secure token-based authentication with Airtable
- ๐ Complete Airtable API Coverage - 10 comprehensive MCP tools covering all operations
- โก FastMCP Framework - Built on the high-performance FastMCP framework
- โ๏ธ Cloud-Ready - Production-ready deployment support
- ๐ Dual Transport - Support for both STDIO and HTTP transport protocols
Security & Reliability
- ๐ Environment-based Configuration - Secure credential management
- โ Type Safety - Full type hints and validation with Pydantic
- ๐งช Comprehensive Testing - Unit tests with pytest and coverage reporting
- ๐ Code Quality - Linting with Ruff and type checking with MyPy
Developer Experience
- ๐ Rich Documentation - Comprehensive setup and usage guides
- ๐ง Easy Setup - Simple installation with uv package manager
- ๐ฏ Typed Parameters - Clear, typed tool parameters for better IDE support
- ๐ Flexible Querying - Advanced filtering, sorting, and search capabilities
๐ Prerequisites
- Python 3.11+ - Latest Python version for optimal performance
- uv - Fast Python package manager (install guide)
- Airtable Developer Account - To create OAuth applications (sign up)
๐ Quick Start
1. Installation
Clone the repository and install dependencies:
git clone https://github.com/onimsha/airtable-mcp-server-oauth.git
cd airtable-mcp-server-oauth
uv sync
2. Airtable OAuth Setup
- Create an Airtable OAuth Application:
- Visit Airtable Developer Hub
- Create a new OAuth integration
- Note your
Client ID
andClient Secret
- Set redirect URI to
http://localhost:8000/oauth/callback
3. Environment Configuration
Copy the environment template and configure your credentials:
cp .env.example .env
Edit .env
with your values:
# Airtable OAuth Configuration
AIRTABLE_CLIENT_ID="your_airtable_client_id_here"
AIRTABLE_CLIENT_SECRET="your_airtable_client_secret_here"
AIRTABLE_REDIRECT_URI="http://localhost:8000/oauth/callback"
# Server Configuration
HOST="0.0.0.0"
PORT=8000
LOG_LEVEL="INFO"
4. Testing with MCP Inspector
Use the official MCP Inspector to test and interact with your server:
-
Start the server:
uv run python -m airtable_mcp http
-
Open MCP Inspector: Visit https://modelcontextprotocol.io/docs/tools/inspector
-
Connect to your server:
- Select "HTTP Streaming" transport
- Enter the URL:
http://localhost:8000/mcp
- Click "Connect"
-
Authenticate with Airtable:
- The server will guide you through OAuth authentication
- Use the inspector to test available MCP tools
5. Run the Server
STDIO Transport (default):
uv run python -m airtable_mcp
# or
uv run airtable-oauth-mcp
HTTP Transport:
uv run python -m airtable_mcp http
# or with custom host/port
uv run python -m airtable_mcp http localhost 8001
Additional Options:
# Set log level
uv run python -m airtable_mcp --log-level DEBUG
# Show help
uv run python -m airtable_mcp --help
# Show version
uv run python -m airtable_mcp --version
The HTTP server will be available at http://localhost:8000/
(or custom host:port) with OAuth endpoints for web integration.
MCP Tools Available
The server provides 10 MCP tools for Airtable operations:
Base Operations:
list_bases()
- List all accessible baseslist_tables(base_id, detail_level?)
- List tables in a basedescribe_table(base_id, table_id)
- Get detailed table schema
Record Operations:
list_records(base_id, table_id, view?, filter_by_formula?, sort?, fields?)
- List records with filteringget_record(base_id, table_id, record_id)
- Get a specific recordcreate_record(base_id, table_id, fields, typecast?)
- Create a single recordcreate_records(base_id, table_id, records, typecast?)
- Create multiple recordsupdate_records(base_id, table_id, records, typecast?)
- Update multiple recordsdelete_records(base_id, table_id, record_ids)
- Delete multiple recordssearch_records(base_id, table_id, filter_by_formula, view?, fields?)
- Search records with formulas
All tools now use typed parameters instead of generic args
, making them more transparent to MCP clients.
Parameter Flexibility:
fields
parameter accepts either a single field name (string) or array of field namessort
parameter expects array of objects:[{"field": "Name", "direction": "asc"}]
๐ก Usage Examples
Basic Record Operations
# List all records in a table
records = await client.call_tool("list_records", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY"
})
# Create a new record
new_record = await client.call_tool("create_record", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY",
"fields": {
"Name": "John Doe",
"Email": "john@example.com",
"Status": "Active"
}
})
# Search records with filtering
filtered_records = await client.call_tool("search_records", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY",
"filter_by_formula": "AND({Status} = 'Active', {Email} != '')",
"fields": ["Name", "Email", "Status"]
})
Advanced Querying
# List records with sorting and filtering
records = await client.call_tool("list_records", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY",
"view": "Grid view",
"filter_by_formula": "{Priority} = 'High'",
"sort": [
{"field": "Created", "direction": "desc"},
{"field": "Name", "direction": "asc"}
],
"fields": ["Name", "Priority", "Created", "Status"]
})
# Batch operations
batch_create = await client.call_tool("create_records", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY",
"records": [
{"fields": {"Name": "Record 1", "Value": 100}},
{"fields": {"Name": "Record 2", "Value": 200}},
{"fields": {"Name": "Record 3", "Value": 300}}
],
"typecast": True
})
Schema Discovery
# List all bases you have access to
bases = await client.call_tool("list_bases")
# Get detailed information about a specific table
table_info = await client.call_tool("describe_table", {
"base_id": "appXXXXXXXXXXXXXX",
"table_id": "tblYYYYYYYYYYYYYY"
})
# List all tables in a base
tables = await client.call_tool("list_tables", {
"base_id": "appXXXXXXXXXXXXXX",
"detail_level": "full"
})
๐ ๏ธ Development
Getting Started
-
Fork and Clone:
git clone https://github.com/onimsha/airtable-mcp-server-oauth.git cd airtable-mcp-server-oauth
-
Setup Development Environment:
uv sync --all-extras
-
Run Tests:
uv run pytest uv run pytest --cov=src/airtable_mcp --cov-report=html
Code Quality
Type Checking:
uv run mypy src/
Linting:
uv run ruff check src/
uv run ruff format src/
Pre-commit Hooks:
pip install pre-commit
pre-commit install
Testing
The project includes comprehensive test coverage:
- Unit Tests: Test individual components and functions
- Integration Tests: Test OAuth flow and Airtable API interactions
- Coverage Reports: Ensure >90% code coverage
# Run all tests
uv run pytest
# Run with coverage
uv run pytest --cov=src/airtable_mcp
# Run specific test files
uv run pytest tests/test_oauth.py
uv run pytest tests/test_tools.py
Project Structure
src/
โโโ airtable_mcp/ # Main MCP server package
โ โโโ __init__.py # Package initialization
โ โโโ __main__.py # Module entry point
โ โโโ main.py # CLI and application entry
โ โโโ api/ # Airtable API client
โ โ โโโ __init__.py
โ โ โโโ client.py # HTTP client for Airtable API
โ โ โโโ exceptions.py # API-specific exceptions
โ โ โโโ models.py # Pydantic models for API responses
โ โโโ mcp/ # MCP server implementation
โ โโโ __init__.py
โ โโโ schemas.py # MCP tool schemas
โ โโโ server.py # FastMCP server with tools
โโโ mcp_oauth_lib/ # Reusable OAuth library
โโโ __init__.py # Library initialization
โโโ auth/ # Authentication components
โ โโโ __init__.py
โ โโโ context.py # Auth context management
โ โโโ middleware.py # OAuth middleware
โ โโโ utils.py # Auth utilities
โโโ core/ # Core OAuth functionality
โ โโโ __init__.py
โ โโโ config.py # OAuth configuration
โ โโโ flow.py # OAuth flow implementation
โ โโโ server.py # OAuth server endpoints
โโโ providers/ # OAuth provider implementations
โ โโโ __init__.py
โ โโโ airtable.py # Airtable OAuth provider
โ โโโ base.py # Base provider interface
โโโ utils/ # OAuth utilities
โโโ __init__.py
โโโ pkce.py # PKCE implementation
โโโ state.py # State management
โ๏ธ Configuration
All configuration is handled through environment variables (loaded from .env
):
Required Variables
AIRTABLE_CLIENT_ID
- OAuth client ID from AirtableAIRTABLE_CLIENT_SECRET
- OAuth client secretAIRTABLE_REDIRECT_URI
- OAuth callback URL
Optional Variables
HOST
- Server host (default:0.0.0.0
)PORT
- Server port (default:8000
)LOG_LEVEL
- Logging level (default:INFO
)MCP_SERVER_NAME
- Server name (optional)MCP_SERVER_VERSION
- Server version (optional)
๐ค Contributing
We welcome contributions! Please see our contribution guidelines:
- Fork the repository and create a feature branch
- Write tests for any new functionality
- Ensure code quality with our linting and formatting tools
- Update documentation for any API changes
- Submit a pull request with a clear description
Contribution Areas
- ๐ Bug fixes - Help us squash bugs
- โจ New features - Add new Airtable API endpoints
- ๐ Documentation - Improve setup guides and examples
- ๐งช Testing - Increase test coverage
- ๐ Performance - Optimize API calls and caching
๐ License
This project is licensed under the MIT License - see the file for details.
๐ Acknowledgments
- FastMCP - Excellent MCP framework
- Airtable - Powerful database platform
- Model Context Protocol - Standard for AI tool integration
๐ Documentation
Additional Resources
๐ Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: Project Wiki