# Keenable > Keenable is a research-driven AI infrastructure company focused on web search and knowledge access for large-scale AI applications. We build systems and new retrieval primitives that make web-scale information accessible to models. We provide these systems to AI labs, inference platforms, and researchers. Keenable is founded on the belief that AI systems should have frictionless access to the world's constantly growing knowledge, and support its further growth. Today, this isn't the case. While agents are becoming more autonomous, they're still not good at accessing the web. In fairness, it's not their fault. We've given them clunky, expensive, human-optimized web access tools, namely "10 blue links" search APIs and slow fetch APIs. Accordingly, they're optimized to access web knowledge sparingly. Keenable aims to remove that bottleneck. Agents should never think twice about querying the web. They shouldn't have to jam dozens of intents into a kitchen sink query. Models should be able to access web knowledge cheaply, as if it were parametric knowledge. They need novel, performant methods for retrieving web content. This is our charter. To achieve this goal, we are building the largest independent web index in the world and researching new access paradigms for better interoperability with AI systems. Keenable is backed by Accel and Conviction, with angels from xAI, Google, Databricks, Snowflake, Clickhouse, Amazon and more. --- # Keenable REST API Base URL: `https://api.keenable.ai`. Authentication: API key via the `X-API-Key` header. Create an API key in the [console](https://keenable.ai/console). --- ## Search Web Pages Search the web and return ranked results with URLs, titles, and descriptions. ```bash curl -X POST "https://api.keenable.ai/v1/search" \ -H "X-API-Key: " \ -H "Content-Type: application/json" \ -d '{ "query": "typescript best practices" }' ``` **Input** | Field | Type | Required | Description | |---|---|---|---| | `query` | string | yes | The search query | **Output** | Field | Type | Description | |---|---|---| | `results` | array | List of search results | | `results[].title` | string | Page title | | `results[].url` | string | Page URL | | `results[].description` | string | Snippet / summary of the page | **Output example** ```json { "results": [ { "title": "TypeScript Best Practices 2026", "url": "https://example.com/ts-best-practices", "description": "A comprehensive guide to modern TypeScript patterns and best practices." } ] } ``` --- ## Fetch Page Content Retrieve content from a URL as clean markdown. Note that only URLs from our index are supported; we don't offer general web scraping. ```bash curl "https://api.keenable.ai/v1/fetch?url=https://example.com/ts-best-practices" \ -H "X-API-Key: " ``` **Input** | Field | Type | Required | Description | |---|---|---|---| | `url` | string | yes | URL to fetch | **Output** | Field | Type | Description | |---|---|---| | `url` | string | The fetched URL | | `title` | string | Page title (if available) | | `content` | string | Extracted page content in markdown | **Output example** ```json { "url": "https://example.com/ts-best-practices", "title": "TypeScript Best Practices 2026", "content": "# TypeScript Best Practices 2026\n\nUse strict mode, prefer interfaces over type aliases for object shapes..." } ``` --- ## Submit Search Feedback Submit per-URL relevance scores after a search to improve result quality over time. ```bash curl -X POST "https://api.keenable.ai/v1/feedback" \ -H "X-API-Key: " \ -H "Content-Type: application/json" \ -d '{ "query": "typescript best practices", "feedback": { "https://example.com/ts-best-practices": 5, "https://example.com/old-js-guide": 1 } }' ``` **Input** | Field | Type | Required | Description | |---|---|---|---| | `query` | string | yes | The original search query | | `feedback` | object | yes | Map of URL to relevance score (0–5) | | `feedback_text` | string | no | Additional feedback in free text | Score scale: 0 = content not loaded, 1 = low relevance, 2 = somewhat relevant, 3 = relevant, 4 = highly relevant, 5 = perfect match. **Output** | Field | Type | Description | |---|---|---| | `message` | string | Confirmation message | **Output example** ```json { "message": "Feedback submitted successfully" } ``` --- # Keenable MCP Server Server URL: `https://api.keenable.ai/mcp` Authentication: API key via the `X-API-Key` header. Create an API key in the [console](https://keenable.ai/console). ## Remote MCP (recommended) Claude Code: ```bash claude mcp add keenable \ --transport http https://api.keenable.ai/mcp \ --scope user \ --header "X-API-Key: " ``` Other MCP clients (Claude Desktop, Cursor, Windsurf, etc.): ```json { "mcpServers": { "keenable": { "url": "https://api.keenable.ai/mcp", "headers": { "X-API-Key": "" } } } } ``` > **Note:** After adding, 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. --- ## Available Tools ### search_web_pages Search the web and return ranked results with URLs, titles, and descriptions. **Input** | Field | Type | Required | Description | |---|---|---|---| | `query` | string | yes | The search query | **Output** | Field | Type | Description | |---|---|---| | `results` | array | List of search results | | `results[].title` | string | Page title | | `results[].url` | string | Page URL | | `results[].description` | string | Snippet / summary of the page | --- ### fetch_page_content Fetch one or more URLs and extract content as clean markdown. Only URLs from the index are supported; this is not a general web scraper. **Input** | Field | Type | Required | Description | |---|---|---|---| | `urls` | string[] | yes | URLs to fetch (min 1) | **Output** One text block per URL, each containing: | Field | Type | Description | |---|---|---| | `url` | string | The fetched URL | | `title` | string | Page title (if available) | | `content` | string | Extracted page content in markdown | --- ### submit_search_feedback Submit per-URL relevance scores after a search to improve result quality over time. **Input** | Field | Type | Required | Description | |---|---|---|---| | `query` | string | yes | The original search query | | `feedback` | object | yes | Map of URL to relevance score (0–5) | | `feedback_text` | string | no | Additional feedback in free text | Score scale: 0 = content not loaded, 1 = low relevance, 2 = somewhat relevant, 3 = relevant, 4 = highly relevant, 5 = perfect match. --- ## Stdio MCP For agents that don't support remote MCP connections, the server is available as an npm package that runs locally over stdio. ```json { "mcpServers": { "keenable": { "command": "npx", "args": ["-y", "@keenable/mcp-server"], "env": { "KEENABLE_API_KEY": "" } } } } ``` ## 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.