Skip to main content
Glama
galangw

MCP WebSearch Server

by galangw
README.md
# MCP WebSearch Server

MCP Server for web search and advanced web scraping. Uses SearchAPI.io for Google Search and AI Mode.

## Quick Start

### Option 1: Stdio (npx)

```json
{
  "mcpServers": {
    "websearch": {
      "command": "npx",
      "args": ["-y", "mcp-websearch-server"],
      "env": {
        "SEARCHAPI_KEY": "your-api-key-here"
      }
    }
  }
}
```

### Option 2: HTTP Server (Streamable HTTP)

Run as HTTP server:
```bash
MCP_TRANSPORT=http PORT=3000 npx mcp-websearch-server
```

Then configure MCP client with API key in URL or header:

**Option A: API key in URL query parameter**
```json
{
  "mcpServers": {
    "websearch": {
      "url": "http://localhost:3000/mcp?apikey=YOUR_KEY",
      "transport": "streamable-http"
    }
  }
}
```

**Option B: API key in header**
```json
{
  "mcpServers": {
    "websearch": {
      "url": "http://localhost:3000/mcp",
      "transport": "streamable-http",
      "headers": {
        "X-API-Key": "YOUR_KEY"
      }
    }
  }
}
```

**Option C: Server-side default key**
```bash
MCP_TRANSPORT=http SEARCHAPI_KEY=default-key PORT=3000 npx mcp-websearch-server
```

The server implements MCP Streamable HTTP transport (spec 2025-03-26) with:
- Session management with `Mcp-Session-Id` headers
- SSE streaming for server-initiated messages
- Resumability support with `Last-Event-ID`
- Per-user API key support via query param or header

Get your API key at [searchapi.io](https://www.searchapi.io/)

## Tools

| Tool | Description |
|------|-------------|
| `web_search` | Google Search with pagination, time filter, site filter |
| `ai_search` | Google AI Mode - get AI-generated answers with sources |
| `web_scrape` | Advanced scraper with multiple extract modes (text/markdown/structured) |
| `get_links` | Extract links from a webpage with optional filter |
| `scrape_multiple` | Scrape up to 5 URLs at once |

## Parameters

### web_search
- `query` - Search query
- `num_results` - Number of results (1-20, default 10)
- `page` - Page number for pagination (1-10)
- `time_period` - Filter: last_hour, last_day, last_week, last_month, last_year
- `site` - Limit to specific site (e.g., "github.com")

### ai_search
- `query` - Question or topic
- `image_url` - Optional image URL for visual questions
- `location` - Location for local queries

### web_scrape
- `url` - URL to scrape
- `selector` - CSS selector (optional)
- `extract_mode` - text, markdown, or structured
- `include_links` - Include links in output
- `max_length` - Max content length (1000-50000)

### get_links
- `url` - URL to extract links from
- `filter` - Text filter for URLs/anchors

### scrape_multiple
- `urls` - Array of URLs (max 5)
- `max_per_page` - Max content per page (500-5000)

## Deployment

### PM2 (Production)

1. Edit `ecosystem.config.js` and set your `SEARCHAPI_KEY`
2. Run: `npm run pm2:start`
3. Check logs: `npm run pm2:logs`

Or manually:
```bash
MCP_TRANSPORT=http PORT=3000 SEARCHAPI_KEY=your-key pm2 start index.js --name mcp-websearch
```

### Docker

```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
ENV MCP_TRANSPORT=http PORT=3000
EXPOSE 3000
CMD ["node", "index.js"]
```

## Roadmap

- [ ] Add Serper.dev provider support
- [ ] Add SerpAPI provider support
- [ ] Provider auto-fallback

## License

MIT