airtable-mcp-server-oauth

onimsha/airtable-mcp-server-oauth

3.3

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.

Tools
10
Resources
0
Prompts
0

Airtable OAuth MCP Server

Python Code style: ruff

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

  1. Create an Airtable OAuth Application:
    • Visit Airtable Developer Hub
    • Create a new OAuth integration
    • Note your Client ID and Client 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:

  1. Start the server:

    uv run python -m airtable_mcp http
    
  2. Open MCP Inspector: Visit https://modelcontextprotocol.io/docs/tools/inspector

  3. Connect to your server:

    • Select "HTTP Streaming" transport
    • Enter the URL: http://localhost:8000/mcp
    • Click "Connect"
  4. 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 bases
  • list_tables(base_id, detail_level?) - List tables in a base
  • describe_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 filtering
  • get_record(base_id, table_id, record_id) - Get a specific record
  • create_record(base_id, table_id, fields, typecast?) - Create a single record
  • create_records(base_id, table_id, records, typecast?) - Create multiple records
  • update_records(base_id, table_id, records, typecast?) - Update multiple records
  • delete_records(base_id, table_id, record_ids) - Delete multiple records
  • search_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 names
  • sort 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

  1. Fork and Clone:

    git clone https://github.com/onimsha/airtable-mcp-server-oauth.git
    cd airtable-mcp-server-oauth
    
  2. Setup Development Environment:

    uv sync --all-extras
    
  3. 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 Airtable
  • AIRTABLE_CLIENT_SECRET - OAuth client secret
  • AIRTABLE_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:

  1. Fork the repository and create a feature branch
  2. Write tests for any new functionality
  3. Ensure code quality with our linting and formatting tools
  4. Update documentation for any API changes
  5. 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

๐Ÿ“š Documentation

Additional Resources

๐Ÿ“ž Support