Keenable Web Search
About
Live web search and clean-markdown page fetch over the Keenable web index, keyless by default.
Details
- Author
- Unknown
- Categories
- Search, Other, API
Jump to
Connect Keenable APIs as tools to clients that support MCP
The Keenable tools are also available as a Model Context Protocol server, so agents like Claude Code, Claude Desktop, Cursor, and Windsurf can call them directly. Pass your API key in theX-API-Keyheader to remove the hourly request limit and raise rate limits — seeAuthenticationandRate limits. Drop the header and the server still answers, on the shared public tier.
Add Keenable to Cursor or VS Code with a single click:
The easiest way to set up the Keenable MCP server for local coding agents is via theKeenable CLI. Once you've installed the CLI, run the following to be guided through the MCP server setup.
Add the Keenable MCP server with the Claude Code CLI:
claude mcp add keenable \ --transport http https://api.keenable.ai/mcp \ --scope user \ --header "X-API-Key: keen_<your_key>"
Omit the--headerflag to run on the public tier instead.
Add the following to~/.codex/config.toml
[mcp_servers.keenable] url = "https://api.keenable.ai/mcp" http_headers = { "X-API-Key" = "keen_<your_key>" }
Omit thehttp_headersline to run on the public tier instead.
For Cursor and other clients that accept a remote MCP URL in their config file:
{ "mcpServers": { "keenable": { "url": "https://api.keenable.ai/mcp", "headers": { "X-API-Key": "keen_<your_key>" } } } }
Omit theheadersblock to run on the public tier instead.
Claude Desktop is not one of these clients.Its config file accepts only localcommandservers, so a"url"entry is ignored without an error and the tools never appear. Use aconnectorinstead, or thelocal bridgeif you want your key applied.
This is for calling the MCP server from your own code against OpenAI's API — different from adding Keenable inside the ChatGPT app itself, which is thePlugins Directory listing. Pass it as a remotemcptool:
from openai import OpenAI client = OpenAI() response = client.responses.create( model="gpt-5", input="What's new in retrieval-augmented generation this week?", tools=[ { "type": "mcp", "server_label": "keenable", "server_url": "https://api.keenable.ai/mcp", "headers": {"X-API-Key": "keen_<your_key>"}, "require_approval": "never", } ], ) print(response.output_text)
Omit theheadersentry to run on the public tier instead.
After adding the Keenable MCP, disable any built-in or third-party search/fetch tools (WebSearch,WebFetch,brave_search,tavily_search, etc.). Keenable tools replace them — leaving both active causes agents to pick inconsistently.
Claude (Desktop, claude.ai, mobile) connects to the remote MCP server through itscustom connectorUI — no config file needed. The connection is made from Anthropic's cloud, so your server just needs to be reachable at its public URL.
ChatGPT and Codex install from thePlugins Directory— Keenable is published there, so it comes from the catalog and signs you in to your Keenable account.
Otherwise add it by URL — Settings → Connectors → Add custom connector — leaving OAuth Client ID / Secret empty: https://api.keenable.ai/mcp
Any client that only speaks local stdio — Claude Desktop's config file is the common case, since its connector UI has no field for a header — needs a bridge to apply your own key.@keenable/mcp-serverruns as a subprocess and forwards to the same endpoint:
{ "mcpServers": { "keenable": { "command": "npx", "args": ["-y", "@keenable/mcp-server"], "env": { "KEENABLE_API_KEY": "keen_<your_key>" } } } }
Needs Node.js on the machine, and the client has to be restarted after editing its config file (for Claude Desktop,claude_desktop_config.json). Drop theenvblock to run it without a key. The same block works verbatim in any other stdio-only client's config, not just Claude Desktop's.
Two tools are exposed by the MCP server.
Search the web and return ranked results with URLs, titles, and descriptions.
acquired_after,acquired_before,published_after, andpublished_beforeeach acceptoneof the following formats:
- Datein RFC 3339full-dateform (YYYY-MM-DD) — covers that whole day in UTC. On an_afterbound it resolves to00:00:00on that date; on a_beforebound it resolves to23:59:59.999on that date, so pages from the named day are kept at either end. Pass a timestamp instead to cut at an exact instant.
- Timestampin ISO 8601 form (YYYY-MM-DDTHH:MM:SS[.sss][±HH:MM]). When a timezone offset is not provided, the timezone is interpreted as UTC.
- Relative delta(<number><unit>, e.g.7d,30min) — resolves to the request time minus the delta, truncated to minute precision. Supported units:min(minutes),h(hours),d(days),mo(months),y(years).
Relative deltas may be combined with absolute values across the two bounds of a window:
{ "query": "...", "published_after": "1y", "published_before": "6mo" }
{ "query": "...", "acquired_after": "2024-01-01", "acquired_before": "30d" }
For example, at request time2026-05-18T14:23:45Z,acquired_after: "2h"resolves to2026-05-18T12:23:00Z— a document acquired at12:22:59Zis dropped, one acquired at12:23:00Zis kept.
Mind the difference between a date and a timestamp on a_beforebound:acquired_before: "2026-05-01"keeps a page acquired at2026-05-01T14:31:13Z, whileacquired_before: "2026-05-01T00:00:00Z"drops it. Use the date form to mean "up to and including that day", and the timestamp form to cut at midnight.
Fetch a URL and extract content as clean markdown. By default only URLs from the index are supported; this is not a general web scraper. Passlive=trueto fetch directly from the source, including URLs that are not indexed.
Returnsurl,title, andcontent(markdown). See theFetch referencefor the response shape.
Platforms embedding Keenable's MCP tools can read billing usage and control tool behaviour through the MCP_metaside channel._metatravels alongside the tool result or request and isnotpart of the model-visible toolcontent, so none of it enters the agent's context.
Every billed (authenticated) tool call returns usage under_meta["keenable/usage"], so you can attribute cost per call without parsing the tool's text output. Unauthenticated calls are unbilled and omit it.
{ "content": [{ "type": "text", "text": "..." }], "_meta": { "keenable/usage": { "sku": "search.realtime", "amount": 1, "credits": 3, "paid": true } } }
To control tool behaviour yourself instead of letting the model decide, send overrides under_meta["keenable/overrides"]on atools/callrequest. They take precedence over the arguments the model generated.
{ "method": "tools/call", "params": { "name": "search_web_pages", "arguments": { "query": "..." }, "_meta": { "keenable/overrides": { "mode": "realtime", "skip_cache": true } } } }
Invalid or unknown override values are ignored rather than erroring the call.
Search global news using natural language. Webz.io News Search API returns the most relevant articles and content, with filters for source, country, language, date, sentiment, and category.
Search the web using Kagi's search API
Multi-provider search broker for AI agents. Routes across SearXNG, Brave, Serper, Tavily, and Exa with automatic fallback, RRF ranking, content extraction, and budget enforcement.
A search server for the Model Context Protocol (MCP) that uses the Baidu Wenxin API.
Perform web, news, and image searches using the Microsoft Bing Search API.
An MCP server for web and local search using the Brave Search API.
Integrates the Brave Search API for both web and local search capabilities. Requires a BRAVE_API_KEY.
An MCP server for the Brave Search API, providing web and local search capabilities via a streaming SSE interface.
An MCP server for the Brave Search API, providing both web and local search capabilities.
Search for cocktail recipes using the cezzis.com API.
Free search API for AI agents — 105 engines, 22 profiles, 94.3% SimpleQA accuracy, MCP server with 5 tools
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.




