trackmcp
Back to directory
onimsha

airtable-mcp-server-oauth

View on GitHub

Airtable MCP Server With HTTP Streaming & Oauth2.1 Support

3 stars PythonAI & Machine Learning Updated Jul 30, 2025
airtablemcp-serveroauth2remote-mcp-server

Documentation

Airtable OAuth MCP Server

Python
License
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:

bash
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:

    3. Environment Configuration

    Copy the environment template and configure your credentials:

    bash
    cp .env.example .env

    Edit `.env` with your values:

    bash
    # 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:

    bash
    uv run python -m airtable_mcp http

    2. Open MCP Inspector:

    Visit https://modelcontextprotocol.io/docs/tools/inspector

    3. Connect to your server:

      4. Authenticate with Airtable:

        5. Run the Server

        STDIO Transport (default):

        bash
        uv run python -m airtable_mcp
        # or
        uv run airtable-oauth-mcp

        HTTP Transport:

        bash
        uv run python -m airtable_mcp http
        # or with custom host/port
        uv run python -m airtable_mcp http localhost 8001

        Additional Options:

        bash
        # 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

        python
        # 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

        python
        # 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

        python
        # 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:

        bash
        git clone https://github.com/onimsha/airtable-mcp-server-oauth.git
           cd airtable-mcp-server-oauth

        2. Setup Development Environment:

        bash
        uv sync --all-extras

        3. Run Tests:

        bash
        uv run pytest
           uv run pytest --cov=src/airtable_mcp --cov-report=html

        Code Quality

        Type Checking:

        bash
        uv run mypy src/

        Linting:

        bash
        uv run ruff check src/
        uv run ruff format src/

        Pre-commit Hooks:

        bash
        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
        bash
        # 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

        code
        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 LICENSE file for details.

        πŸ™ Acknowledgments

        πŸ“š Documentation

        Additional Resources

        πŸ“ž Support

        Frequently asked questions

        What is airtable-mcp-server-oauth?

        airtable-mcp-server-oauth is Airtable MCP Server With HTTP Streaming & Oauth2.1 Support

        How do I install airtable-mcp-server-oauth?

        Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

        Is airtable-mcp-server-oauth open source?

        Yes β€” it is hosted on GitHub at https://github.com/onimsha/airtable-mcp-server-oauth and has 3 stars.

        Related MCP tools

        Run your own MCP server? See who uses it and what to fix.

        Measure it with TrackMCP