serpens-mcp
MCP server for SERPens — Google Search & SERP API. Gives an AI agent live Googleresults: organic links, snippets, sitelinks, People Also Ask, related searches, andGoogle's AI Overview.
Zero dependencies. One file of protocol, one HTTP client, nothing else. There is nobuild step, no lockfile, and no third-party code between your agent and the API — cloneit and it runs.
Install
Get a key from the API listing.The free plan needs no card.
git clone https://github.com/ivashhchenko/serpens-mcp.git
Claude Desktop — claude_desktop_config.json:
{
"mcpServers": {
"serpens": {
"command": "node",
"args": ["/absolute/path/to/serpens-mcp/src/index.js"],
"env": { "SERPENS_API_KEY": "your-rapidapi-key" }
}
}
}
Claude Code:
claude mcp add serpens --env SERPENS_API_KEY=your-rapidapi-key \
-- node /absolute/path/to/serpens-mcp/src/index.js
Cursor, Windsurf, Zed and other stdio clients take the same command / args / envshape as the JSON above.
Node 18 or newer. Nothing to install after the clone.
Tools
| Tool | What it returns |
|---|---|
google_search |
Organic results — title, link, snippet, source, position — plus sitelinks, People Also Ask and related searches when Google renders them |
google_ai_overview |
Google's AI Overview with citations, alongside organic results. When Google renders no overview, organic results still come back |
Both accept the same arguments:
| Argument | Type | Notes |
|---|---|---|
q |
string, required | Google operators work: site:github.com fastify |
gl |
string | Country, two lowercase letters. Default us |
hl |
string | Interface language, en or en-gb. Default en |
page |
integer ≥ 1 | No upper bound. Page 40 is a call like any other |
tbs |
string | Google time/filter token, e.g. qdr:d for the past day |
autocorrect |
boolean | Default true |
format |
markdown | json |
Default markdown |
Output
By default results come back as Markdown, because that is what a model reads best:
# Search results: fastify nodejs
## Organic results
### 1. [Fastify](https://fastify.dev/)
fastify.dev
Fast and low overhead web framework, for Node.js
- [Documentation](https://fastify.dev/docs/)
Pass format: "json" to get the raw API response instead, unchanged, when your pipelinewants to parse fields itself.
Configuration
| Variable | Default | Purpose |
|---|---|---|
SERPENS_API_KEY |
— | Required. RAPIDAPI_KEY also works |
SERPENS_HOST |
serpens.p.rapidapi.com |
Override the API host |
SERPENS_TIMEOUT_MS |
30000 |
Client-side request timeout |
Why a package and not a remote MCP URL
The API also speaks MCP over HTTP, so you can point a client straight at it. Going throughthis package costs you less: the marketplace bills every request on a declared path,initialize and tools/list included, and an agent sends those on every connect. Here thehandshake is local and only searches reach the network.
Coming from Serper
The underlying API returns Serper's response shape field for field on the /searchendpoint, so an existing Serper integration migrates by changing the base URL. This packageis for the agent path; the REST path needs no wrapper at all.
Image, news, places, scholar and shopping verticals are not implemented — if yourintegration calls those, it needs more than a base-URL change.
Errors
Tool errors carry the API's own error.code so you can branch on it:
invalid_gl: gl must be two lowercase letters
capacity_unavailable: no capacity right now (transient — retrying may help)
License
MIT