Bundling nine search APIs into one server would put every parameter set in front of the model on every turn; splitting them into nine scripts means a config that lists three of them costs a third of the definitions. The trade is setup: each one is a separate stdio entry with an absolute path, so wiring all nine is nine blocks of JSON. The YouTube transcript server is the odd one out — it does not go through SerpAPI at all, which is why it takes a proxy and a cookies path for videos that need them.
A collection of single-purpose MCP servers rather than one big one. Each search surface lives in its own script and gets its own entry in your client config, so a client that only needs Google News never sees the maps or finance surface. Every result can come back as raw JSON or as markdown-formatted text.
- Google web search with the parameters you would normally reach for — result count, pagination offset, `location`, country and language codes, device type, safe search, recency filter, exact-phrase terms, and domain include/exclude lists — `serpapi_google_search.py`
- Google News scoped by publication, topic, story or section token, sorted by relevance or by date — `serpapi_google_news.py`
- Google Scholar with year range, language restriction, cited-by and all-versions lookups, and a review-articles-only switch — `serpapi_google_scholar.py`
- Google Trends by geography and time range, with the data type selectable (timeseries, geo map) and a property filter for web, news or images — `serpapi_google_trend.py`
- Google Finance for a stock, index, fund, currency or future, with the graph window selectable from one day out to max — `serpapi_google_finance.py`
- Google Maps as either a search or a single place lookup, addressable by place ID or by GPS coordinates with a zoom level — `serpapi_google_maps.py`
- Google Images filtered by aspect ratio, size, colour, image type and licence scope — `serpapi_google_images.py`
- YouTube search by query with country, language and filter parameters, and a separate transcript server that takes a video URL and returns the transcript with optional timestamps, a language choice, and a cookies file for age-restricted videos — `serpapi_youtube_search.py`, `youtube_transcript.py`
- A consistent output switch on every surface: `raw_json` for the complete API response, `readable_json` for markdown you can drop straight into an answer
A SerpAPI key, placed in a `.env` file at the project root as `SERPAPI_API_KEY` — the same key serves every server. Python 3.8 or higher. There is no package install: clone the repository, create a virtual environment, `pip install -r requirements.txt`, and register each server you want in your client config as a stdio entry pointing python at the script, with `PYTHONPATH` set to your site-packages. The project identifies itself as `serpapi-mcp-server` (0.1.0 in pyproject).
Build from source — clone the repository and build it, then point your client at the binary
