Skip to main content
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. No API key is needed — the MCP server works without an account. Add an API key to remove the hourly request limit and raise rate limits (see Authentication and Rate limits).

Installation

One-click install

Add Keenable to Cursor or VS Code with a single click:

Install via CLI

The easiest way to set up the Keenable MCP server for local coding agents is via the Keenable CLI. Once you’ve installed the CLI, run the following to be guided through the MCP server setup.
keenable configure-mcp

Claude Code

Add the Keenable MCP server with the Claude Code CLI:
claude mcp add keenable \
  --transport http https://api.keenable.ai/mcp \
  --scope user
To use an API key:
claude mcp add keenable \
  --transport http https://api.keenable.ai/mcp \
  --scope user \
  --header "X-API-Key: keen_<your_key>"

Codex

Add the following to ~/.codex/config.toml
[mcp_servers.keenable]
url = "https://api.keenable.ai/mcp"
To use an API key, add the header:
[mcp_servers.keenable]
url = "https://api.keenable.ai/mcp"
http_headers = { "X-API-Key" = "keen_<your_key>" }

Other MCP clients

For Claude Desktop, Cursor, Windsurf, and similar:
{
  "mcpServers": {
    "keenable": {
      "url": "https://api.keenable.ai/mcp"
    }
  }
}
To use an API key:
{
  "mcpServers": {
    "keenable": {
      "url": "https://api.keenable.ai/mcp",
      "headers": {
        "X-API-Key": "keen_<your_key>"
      }
    }
  }
}
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.

OAuth

The remote MCP server at https://api.keenable.ai/mcp supports the MCP OAuth authorization flow, so clients can authenticate without manually passing an API key. In practice, most MCP clients have unstable OAuth implementations, so we don’t currently recommend this path. Use an API key instead.

Available tools

Two tools are exposed by the MCP server.

search_web_pages

Search the web and return ranked results with URLs, titles, and descriptions.
query
string
required
The search query.
site
string
Restrict results to a specific site (e.g. "techcrunch.com").
acquired_after
string
Filter to pages acquired/indexed at or after this point in time.
acquired_before
string
Filter to pages acquired/indexed at or before this point in time.
published_after
string
Filter to pages published at or after this point in time.
published_before
string
Filter to pages published at or before this point in time.

Date and time filters

acquired_after, acquired_before, published_after, and published_before each accept one of the following formats:
  • Date in RFC 3339 full-date form (YYYY-MM-DD) — resolves to 00:00:00 UTC on that date.
  • Timestamp in 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).
Example values:
ValueResolves to
2026-01-152026-01-15T00:00:00Z
2026-01-15T10:30:002026-01-15T10:30:00Z (no offset → UTC)
2026-01-15T10:30:00Z2026-01-15T10:30:00Z
2026-01-15T10:30:00.500-05:002026-01-15T15:30:00.500Z
7d7 days before request time, truncated to the minute
30min30 minutes before request time, truncated to the minute
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 time 2026-05-18T14:23:45Z, acquired_after: "2h" resolves to 2026-05-18T12:23:00Z — a document acquired at 12:22:59Z is dropped, one acquired at 12:23:00Z is kept.

fetch_page_content

Fetch a URL and extract content as clean markdown. Only URLs from the index are supported; this is not a general web scraper.
url
string
required
The URL to fetch.
max_chars
integer
default:"50000"
Maximum number of characters of content to return. Longer content is truncated.
Returns url, title, and content (markdown). See the Fetch reference for the response shape.