Skip to main content
Glama
README.md
# SearchAPI MCP Server

<div align="center">

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![FastMCP](https://img.shields.io/badge/FastMCP-Latest-green.svg)](https://github.com/jlowin/fastmcp)

A production-ready Model Context Protocol (MCP) server providing comprehensive search capabilities through SearchAPI.io. Enable AI assistants to search Google, Maps, Flights, Hotels, and more with built-in caching, retry logic, and circuit breakers.

一个基于 Model Context Protocol (MCP) 的生产级搜索服务器,通过 SearchAPI.io 提供全面的搜索功能。使 AI 助手能够搜索 Google、地图、航班、酒店等,内置缓存、重试逻辑和熔断器。

[Features](#features) • [Quick Start](#quick-start) • [Installation](#installation) • [Configuration](#configuration) • [Available Tools](#available-tools)

</div>

---

## Features

### 🔍 Search Engines
- **Google Search** - Web results, knowledge graph, answer boxes, related questions
- **Google Videos** - Video search with filtering by duration, source, and upload time
- **Google AI Mode** - AI-generated overviews with cited sources and structured content
- **Google Maps** - Places, businesses, reviews, and location details
- **Google Maps Place** - Detailed information for specific locations (hours, photos, amenities)
- **Google Events** - Find concerts, conferences, festivals, and local activities
- **Google Flights** - Flight search with comprehensive filtering and price calendars
- **Google Flights Location Search** - Airport code lookup and autocomplete
- **Google Travel Explore** - Discover destinations and travel inspiration
- **Google Hotels** - Accommodation search with amenities, ratings, and price filters

### 🏗️ Production-Ready Architecture
- **Connection Pooling** - Efficient HTTP connection management with httpx
- **Response Caching** - Configurable TTL-based caching with LRU eviction
- **Retry Logic** - Exponential backoff for transient failures
- **Circuit Breaker** - Fail-safe pattern preventing cascading failures
- **Metrics Collection** - Request counts, latencies, cache hit rates, error tracking
- **Health Checks** - Monitor API connectivity and service status

### ⚙️ Configuration & Monitoring
- **Pydantic Validation** - Type-safe configuration with environment variable support
- **Structured Logging** - Configurable log levels with detailed request tracing
- **Resource Management** - Automatic cleanup and graceful shutdown
- **Environment Variables** - Flexible configuration for different deployments

---

## Quick Start

### Prerequisites
- Python 3.10 or higher
- SearchAPI.io API key ([Get one here](https://www.searchapi.io/))

### Installation with UV (Recommended)

The fastest way to get started is using `uvx`:

```bash
# Set your API key
export SEARCHAPI_API_KEY="your_api_key_here"

# Run directly with uvx (no installation needed)
uvx --from git+https://github.com/RmMargt/searchAPI-mcp.git mcp-server-searchapi
```

---

## Installation

### Method 1: UV (Recommended)

UV is the fastest and most convenient method:

```bash
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh

# Clone the repository
git clone https://github.com/RmMargt/searchAPI-mcp.git
cd searchAPI-mcp

# Install dependencies
uv pip install -r requirements.txt
```

### Method 2: pip

```bash
# Clone the repository
git clone https://github.com/RmMargt/searchAPI-mcp.git
cd searchAPI-mcp

# Create and activate virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: .\venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt
```

### Method 3: From Source

```bash
git clone https://github.com/RmMargt/searchAPI-mcp.git
cd searchAPI-mcp

# Using uv
uv pip install httpx fastmcp python-dotenv pydantic pydantic-settings

# Or using pip
pip install httpx fastmcp python-dotenv pydantic pydantic-settings
```

---

## Configuration

### Environment Variables

Create a `.env` file in the project root:

```bash
# Required
SEARCHAPI_API_KEY=your_api_key_here

# Optional - API Configuration
SEARCHAPI_API_URL=https://www.searchapi.io/api/v1/search
TIMEOUT=30.0
MAX_RETRIES=3
RETRY_BACKOFF=1.0

# Optional - Cache Configuration
ENABLE_CACHE=true
CACHE_TTL=3600
CACHE_MAX_SIZE=1000

# Optional - Connection Pool
POOL_CONNECTIONS=10
POOL_MAXSIZE=10

# Optional - Monitoring
ENABLE_METRICS=true
LOG_LEVEL=INFO
```

### MCP Client Configuration

#### Claude Desktop

Add to your Claude Desktop configuration file:

**Location:**
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- Linux: `~/.config/Claude/claude_desktop_config.json`

**Using UV (Recommended):**
```json
{
  "mcpServers": {
    "searchapi": {
      "command": "uvx",
      "args": [
        "--directory",
        "/absolute/path/to/searchAPI-mcp",
        "python",
        "mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

**Using Python directly:**
```json
{
  "mcpServers": {
    "searchapi": {
      "command": "python",
      "args": [
        "/absolute/path/to/searchAPI-mcp/mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

**Using virtual environment:**
```json
{
  "mcpServers": {
    "searchapi": {
      "command": "/absolute/path/to/searchAPI-mcp/venv/bin/python",
      "args": [
        "/absolute/path/to/searchAPI-mcp/mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

#### VS Code (Continue, Cline)

Add to `.vscode/mcp.json` in your workspace or use the "MCP: Open User Configuration" command:

```json
{
  "servers": {
    "searchapi": {
      "command": "python",
      "args": [
        "/absolute/path/to/searchAPI-mcp/mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

**With UV:**
```json
{
  "servers": {
    "searchapi": {
      "command": "uvx",
      "args": [
        "--directory",
        "/absolute/path/to/searchAPI-mcp",
        "python",
        "mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

#### Zed Editor

Add to `~/.config/zed/settings.json`:

```json
{
  "context_servers": {
    "searchapi": {
      "command": {
        "path": "python",
        "args": [
          "/absolute/path/to/searchAPI-mcp/mcp_server_refactored.py"
        ],
        "env": {
          "SEARCHAPI_API_KEY": "your_api_key_here"
        }
      }
    }
  }
}
```

#### Cline (VS Code Extension)

In Cline settings, add to MCP Servers:

```json
{
  "mcpServers": {
    "searchapi": {
      "command": "python",
      "args": [
        "/absolute/path/to/searchAPI-mcp/mcp_server_refactored.py"
      ],
      "env": {
        "SEARCHAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

#### Generic MCP Client

For any MCP-compatible client:

```bash
# Using stdio transport (default)
python /path/to/searchAPI-mcp/mcp_server_refactored.py

# With environment variable
SEARCHAPI_API_KEY=your_key python mcp_server_refactored.py
```

---

## Available Tools

### Health & Monitoring

#### `health_check`
Check the health and performance of the SearchAPI service.

**Returns:**
- API connectivity status
- Response latency
- Circuit breaker state
- Cache statistics
- Request metrics

**Example:**
```json
{
  "api_status": {
    "status": "healthy",
    "latency_ms": 145.23,
    "circuit_breaker": "closed"
  },
  "cache_stats": {
    "size": 42,
    "max_size": 1000,
    "ttl": 3600
  },
  "metrics": {
    "request_count": 156,
    "error_count": 2,
    "cache_hit_rate": 0.67
  }
}
```

---

### Time & Date Utilities

#### `get_current_time`
Get current time and travel date suggestions. Essential for flight and hotel bookings.

**Parameters:**
- `format` - Date format: "iso", "slash", "chinese", "timestamp", "full"
- `days_offset` - Days from today (can be negative)
- `return_future_dates` - Return array of future dates
- `future_days` - Number of future dates (if return_future_dates=true)

**Example:**
```python
# Get today's date in ISO format
get_current_time(format="iso")
# Returns: {"date": "2025-11-16", "now": {...}, "travel_dates": {...}}

# Get date 7 days from now with future dates array
get_current_time(days_offset=7, return_future_dates=True, future_days=30)
```

---

### Google Search

#### `search_google`
Search Google for web results, knowledge graphs, and answer boxes.

**Parameters:**
- `q` (required) - Search query
- `location` - Location name (e.g., "New York, NY")
- `gl` - Country code (default: "us")
- `hl` - Language code (default: "en")
- `time_period` - Time filter: "last_hour", "last_day", "last_week", "last_month", "last_year"
- `num` - Results per page (default: "10")
- `safe` - Safe search: "off", "active"

**Example:**
```python
search_google(
    q="Python programming tutorials",
    location="San Francisco, CA",
    time_period="last_month",
    num="20"
)
```

#### `search_google_videos`
Search Google Videos for video content.

**Parameters:** Similar to `search_google` with video-specific filters
- `q` (required) - Search query
- `time_period` - Filter by upload time
- `device` - "desktop" or "mobile"

**Example:**
```python
search_google_videos(
    q="machine learning tutorial",
    time_period="last_week",
    num="10"
)
```

#### `search_google_ai_mode`
Search with AI-generated overviews and cited sources.

**Parameters:**
- `q` - Search query (required unless url provided)
- `url` - Image URL to search
- `location` - Location for localized results

**Returns:**
- AI-generated overview with citations
- Structured content blocks (paragraphs, lists, tables, code)
- Reference links
- Web results

**Example:**
```python
search_google_ai_mode(
    q="How does machine learning work?",
    location="United States"
)
```

---

### Google Maps

#### `search_google_maps`
Search for places, businesses, and services.

**Parameters:**
- `query` (required) - Search query
- `location_ll` - Lat/lng coordinates (format: "@lat,lng,zoom")

**Example:**
```python
search_google_maps(
    query="coffee shops near Central Park",
    location_ll="@40.7829,-73.9654,15z"
)
```

#### `search_google_maps_place`
Get detailed information for a specific place.

**Parameters:**
- `place_id` (required if no data_id) - Google Maps place ID
- `data_id` - Alternative place identifier
- `google_domain` - Google domain (default: "google.com")
- `hl` - Language code (default: "en")

**Example:**
```python
search_google_maps_place(
    place_id="ChIJN1t_tDeuEmsRUsoyG83frY4"
)
```

#### `search_google_maps_reviews`
Get reviews for a specific place.

**Parameters:**
- `place_id` (required if no data_id) - Google Maps place ID
- `data_id` - Alternative place identifier
- `sort_by` - "most_relevant", "newest", "highest_rating", "lowest_rating"
- `rating` - Filter by rating: "1"-"5"

**Example:**
```python
search_google_maps_reviews(
    place_id="ChIJN1t_tDeuEmsRUsoyG83frY4",
    sort_by="newest",
    rating="5"
)
```

---

### Google Events

#### `search_google_events`
Search for events, concerts, conferences, and activities.

**Parameters:**
- `q` (required) - Search query (e.g., "concerts in NYC", "tech conferences")
- `location` - Location name for localized results
- `chips` - Date filter ("today", "tomorrow", "week", "weekend", "month") or event type
- `gl` - Country code (default: "us")
- `hl` - Language code (default: "en")
- `page` - Page number (default: "1")

**Example:**
```python
search_google_events(
    q="music festivals in Austin",
    chips="weekend",
    location="Austin, TX"
)
```

---

### Google Flights

#### `search_google_flights`
Search for flights with comprehensive filtering.

**Parameters:**
- `departure_id` (required) - Airport code (e.g., "JFK")
- `arrival_id` (required) - Airport code (e.g., "LAX")
- `outbound_date` (required) - Departure date (YYYY-MM-DD)
- `flight_type` - "one_way", "round_trip", "multi_city"
- `return_date` - Return date (required for round_trip)
- `travel_class` - "economy", "premium_economy", "business", "first"
- `stops` - "0" (nonstop), "1", "2"
- `adults` - Number of adults
- `currency` - Currency code (e.g., "USD")

**Example:**
```python
search_google_flights(
    departure_id="JFK",
    arrival_id="LAX",
    outbound_date="2025-12-15",
    return_date="2025-12-22",
    flight_type="round_trip",
    travel_class="economy",
    stops="0",
    adults="2"
)
```

#### `search_google_flights_calendar`
Get price calendar for flexible date planning.

**Parameters:**
- `flight_type` (required) - "one_way" or "round_trip"
- `departure_id` (required) - Airport code
- `arrival_id` (required) - Airport code
- `outbound_date` (required) - Reference date
- `return_date` - Required for round_trip

**Example:**
```python
search_google_flights_calendar(
    flight_type="round_trip",
    departure_id="SFO",
    arrival_id="NYC",
    outbound_date="2025-12-01",
    return_date="2025-12-08"
)
```

#### `search_google_flights_location_search`
Search for airport codes and locations.

**Parameters:**
- `q` (required) - Search query (airport name, city, or code)
- `gl` - Country code (default: "us")
- `hl` - Language code (default: "en")

**Example:**
```python
search_google_flights_location_search(
    q="Tokyo"
)
```

#### `search_google_travel_explore`
Explore travel destinations and find inspiration.

**Parameters:**
- `departure_id` (required) - Departure airport code or location
- `arrival_id` - Destination (defaults to anywhere)
- `time_period` - Travel period (e.g., "two_week_trip_in_december")
- `interests` - Filter by interests: "popular", "outdoors", "beaches", "museums", "history", "skiing"
- `travel_class` - "economy", "premium_economy", "business", "first_class"
- `adults` - Number of adults (default: "1")
- `currency` - Currency code (default: "USD")

**Example:**
```python
search_google_travel_explore(
    departure_id="JFK",
    interests="beaches",
    time_period="two_week_trip_in_december"
)
```

---

### Google Hotels

#### `search_google_hotels`
Search for hotels and accommodation.

**Parameters:**
- `q` (required) - Location query
- `check_in_date` (required) - Check-in date (YYYY-MM-DD)
- `check_out_date` (required) - Check-out date (YYYY-MM-DD)
- `adults` - Number of adults (default: "2")
- `rating` - Minimum rating: "3", "4", "5"
- `hotel_class` - Star rating: "2"-"5"
- `price_min` / `price_max` - Price range
- `amenities` - Filter by amenities (e.g., "pool,wifi,parking")
- `free_cancellation` - "true" or "false"

**Example:**
```python
search_google_hotels(
    q="hotels in Paris",
    check_in_date="2025-12-20",
    check_out_date="2025-12-25",
    adults="2",
    rating="4",
    amenities="wifi,pool",
    price_max="300",
    free_cancellation="true"
)
```

#### `search_google_hotels_property`
Get detailed information for a specific hotel.

**Parameters:**
- `property_token` (required) - Property ID from search results
- `check_in_date` (required) - Check-in date
- `check_out_date` (required) - Check-out date
- `adults` - Number of adults

**Example:**
```python
search_google_hotels_property(
    property_token="ChIJd8BlQ2BZwokRAFUEcm_qrcA",
    check_in_date="2025-12-20",
    check_out_date="2025-12-25",
    adults="2"
)
```

---

## Usage Examples

### Example 1: Discover and Plan a Trip

```python
# 1. Explore destinations from New York
destinations = search_google_travel_explore(
    departure_id="JFK",
    interests="beaches",
    time_period="two_week_trip_in_december"
)

# 2. Get current date and travel dates
dates = get_current_time(return_future_dates=True, future_days=30)
check_in = dates["travel_dates"]["next_week"]
check_out = dates["travel_dates"]["next_month"]

# 3. Search for flights
flights = search_google_flights(
    departure_id="JFK",
    arrival_id="CDG",
    outbound_date=check_in,
    return_date=check_out,
    flight_type="round_trip",
    travel_class="economy",
    adults="2"
)

# 4. Search for hotels
hotels = search_google_hotels(
    q="hotels in Paris",
    check_in_date=check_in,
    check_out_date=check_out,
    adults="2",
    rating="4",
    amenities="wifi,breakfast"
)

# 5. Find nearby restaurants
restaurants = search_google_maps(
    query="restaurants near Eiffel Tower"
)

# 6. Get detailed place info
place_details = search_google_maps_place(
    place_id=restaurants["local_results"][0]["place_id"]
)

# 7. Find local events
events = search_google_events(
    q="concerts in Paris",
    chips="weekend"
)
```

### Example 2: Research with AI Mode

```python
# Get AI-generated overview with sources
result = search_google_ai_mode(
    q="What are the health benefits of Mediterranean diet?",
    location="United States"
)

# Result includes:
# - result["markdown"] - AI overview in markdown format
# - result["text_blocks"] - Structured content blocks
# - result["reference_links"] - Cited sources
# - result["web_results"] - Traditional search results
```

### Example 3: Monitor Service Health

```python
# Check API health and metrics
health = health_check()

print(f"Status: {health['api_status']['status']}")
print(f"Latency: {health['api_status']['latency_ms']}ms")
print(f"Cache hit rate: {health['metrics']['cache_hit_rate']:.2%}")
print(f"Total requests: {health['metrics']['request_count']}")
```

---

## Development

### Running Tests

```bash
# Run all tests
python -m pytest

# Run specific test file
python test_refactored.py
```

### Code Structure

```
searchAPI-mcp/
├── mcp_server_refactored.py  # Main MCP server with FastMCP
├── config.py                  # Configuration with Pydantic validation
├── client.py                  # HTTP client with pooling, retry, caching
├── requirements.txt           # Python dependencies
├── .env.example              # Example environment variables
└── tests/                    # Test files
```

### Key Components

- **mcp_server_refactored.py** - MCP server implementation using FastMCP
  - Tool definitions with comprehensive docstrings
  - Health checks and monitoring endpoints
  - Clean shutdown and resource management

- **config.py** - Configuration management
  - Pydantic models for type-safe configuration
  - Environment variable validation
  - Sensible defaults with override options

- **client.py** - Production-ready HTTP client
  - Connection pooling with httpx
  - Exponential backoff retry logic
  - TTL-based response caching
  - Circuit breaker pattern
  - Metrics collection

### Debugging

Use the MCP Inspector to test tools:

```bash
# Install inspector
npm install -g @modelcontextprotocol/inspector

# Run inspector
npx @modelcontextprotocol/inspector python mcp_server_refactored.py
```

Set environment variable for verbose logging:

```bash
LOG_LEVEL=DEBUG python mcp_server_refactored.py
```

---

## Troubleshooting

### Common Issues

**Issue: "Invalid API key" error**
- Solution: Ensure `SEARCHAPI_API_KEY` is set correctly in environment or .env file
- Get an API key at https://www.searchapi.io/

**Issue: "Circuit breaker is OPEN" error**
- Cause: Too many consecutive API failures
- Solution: Check your internet connection and API key. Wait 60 seconds for circuit to reset, or restart the server

**Issue: Connection timeouts**
- Solution: Increase timeout in .env: `TIMEOUT=60.0`
- Check network connectivity to SearchAPI.io

**Issue: High latency**
- Solution: Enable caching if disabled: `ENABLE_CACHE=true`
- Increase cache size: `CACHE_MAX_SIZE=5000`
- Check `health_check` tool for metrics

**Issue: Windows encoding errors**
- Solution: Set environment variable in your MCP client config:
  ```json
  "env": {
    "PYTHONIOENCODING": "utf-8",
    "SEARCHAPI_API_KEY": "your_key"
  }
  ```

### Getting Help

- Check the [MCP Documentation](https://modelcontextprotocol.io/)
- Review [SearchAPI.io Documentation](https://www.searchapi.io/docs)
- Open an issue on [GitHub](https://github.com/RmMargt/searchAPI-mcp/issues)

---

## Performance Tuning

### Cache Configuration

For higher cache hit rates:
```bash
CACHE_TTL=7200        # 2 hours
CACHE_MAX_SIZE=5000   # Store more results
```

For memory-constrained environments:
```bash
CACHE_TTL=1800        # 30 minutes
CACHE_MAX_SIZE=100    # Smaller cache
```

### Connection Pool

For high-traffic scenarios:
```bash
POOL_CONNECTIONS=50
POOL_MAXSIZE=50
```

For low-traffic scenarios:
```bash
POOL_CONNECTIONS=5
POOL_MAXSIZE=5
```

---

## Security Considerations

⚠️ **Important Security Notes:**

1. **API Key Protection**
   - Never commit `.env` file to version control
   - Use environment variables in production
   - Rotate API keys regularly

2. **Rate Limiting**
   - SearchAPI.io has rate limits based on your plan
   - Built-in retry logic respects rate limits
   - Monitor usage with `health_check` tool

3. **Data Privacy**
   - Search queries are sent to SearchAPI.io
   - Responses are cached locally (configurable)
   - Review SearchAPI.io privacy policy

---

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

---

## Acknowledgments

- **[Model Context Protocol](https://modelcontextprotocol.io/)** - Protocol specification by Anthropic
- **[FastMCP](https://github.com/jlowin/fastmcp)** - Python MCP framework
- **[SearchAPI.io](https://www.searchapi.io/)** - Search API service provider
- **[httpx](https://www.python-httpx.org/)** - Modern HTTP client for Python
- **[Pydantic](https://docs.pydantic.dev/)** - Data validation framework

---

## Contributing

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.

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request

---

## Changelog

### v1.1.0 (Current)
- ✅ **New:** Google Maps Place API - Detailed place information
- ✅ **New:** Google Events API - Event and activity search
- ✅ **New:** Google Travel Explore API - Destination discovery
- ✅ **New:** Google Flights Location Search API - Airport lookup
- ✅ Enhanced tourism and travel research capabilities
- ✅ Comprehensive travel planning workflow support

### v1.0.0
- ✅ Production-ready architecture with FastMCP
- ✅ Connection pooling and retry logic
- ✅ Response caching with TTL
- ✅ Circuit breaker pattern
- ✅ Comprehensive health checks and metrics
- ✅ Google Search, Videos, AI Mode
- ✅ Google Maps and Reviews
- ✅ Google Flights and Calendar
- ✅ Google Hotels and Property details
- ✅ Time utilities for travel planning

---

<div align="center">

**[⬆ Back to Top](#searchapi-mcp-server)**

Made with ❤️ for the MCP community

</div>