> ## Documentation Index
> Fetch the complete documentation index at: https://docs.keenable.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Keenable search and fetch work without an API key. To add them to code, use the official SDK for the project's language: https://docs.keenable.ai/sdks.md
> Read an API key from the KEENABLE_API_KEY environment variable. Never ask a user to paste a key into chat; send them to https://docs.keenable.ai/api-keys.md
> On 402 with an API key (code insufficient_credits), stop and ask a human to add credits; don't retry. On the pay-per-request paths a 402 is the payment offer: pay it and retry, see https://docs.keenable.ai/pay-per-request.md. On 429, wait the number of seconds in Retry-After, then retry.
> Every error, with its cause and fix: https://docs.keenable.ai/errors.md

# Agent skill

> Install the keenable-web-search agent skill with npx skills add: your agent searches the web by running a bundled Python script, with no API key, no MCP client and nothing to pip install.

Give your agent web search without an MCP client or an API key. The `keenable-web-search` skill is a folder with instructions and one Python script. When a task needs current information, your agent runs the script and gets ranked results with titles, URLs and snippets.

## Skill or MCP server

Both give your agent Keenable search. Pick by what your agent can run:

| | Agent skill | [MCP server](https://docs.keenable.ai/mcp-server.md) |
| - | - | - |
| Your agent needs | A shell and Python 3 | An MCP client |
| Search | `scripts/search.py` | `search_web_pages` |
| Read a page | Not included | `fetch_page_content` |
| API key | Not supported. Every call is keyless. | Optional |

The skill's calls count against the [keyless rate limit](https://docs.keenable.ai/rate-limits.md) for your IP address. To use an API key, connect the MCP server.

You can install both. The skill tells your agent to open the most relevant URL before it relies on a snippet, and `fetch_page_content` returns that page as markdown.

## Install

Run this command in your project directory. It needs Node.js, and it copies the skill from the [keenable-mcp repository](https://github.com/keenableai/keenable-mcp) into the skills folder of the agent you name:

```bash theme={"system"}
npx skills add keenableai/keenable-mcp --skill keenable-web-search -a claude-code -y
```

The command ends with the install location:

```text theme={"system"}
✓ keenable-web-search (copied)
  → ./.claude/skills/keenable-web-search
```

Change `-a` to install for another agent. With `-a cursor` or `-a codex`, the skill goes to `./.agents/skills/keenable-web-search`. Add `-g` to install for your user account instead of one project.

The skill is also listed on [skills.sh](https://skills.sh/keenableai/keenable-mcp/keenable-web-search) and on [ClawHub](https://clawhub.ai/keenable/keenable-web-search). The Claude Code and Cursor plugins in the same repository install the MCP server, not this skill.

## What the skill contains

| File | Purpose |
| - | - |
| `SKILL.md` | The name, description and trigger words your agent matches against a task, plus usage instructions. |
| `scripts/search.py` | Sends one keyless search to `https://api.keenable.ai/v1/search/public`. It uses only the Python standard library. |
| `skill-card.md` | A summary of the publisher, license (MIT), output and known risks. |

The script takes a query and these flags:

| Flag | What it does |
| - | - |
| `--site <domain>` | Returns results from one site, for example `--site arxiv.org`. |
| `--published-after`, `--published-before` | Bounds the publish date, as `YYYY-MM-DD`. |
| `--acquired-after`, `--acquired-before` | Bounds the date Keenable indexed the page, as `YYYY-MM-DD`. |
| `--json` | Prints the raw API response instead of formatted text. |

## Check that it works

1. List the installed skills:

   ```bash theme={"system"}
   npx skills list
   ```

   You see `keenable-web-search` with its path and the agent it is installed for.

2. Run the script yourself, from the project directory:

   ```bash theme={"system"}
   python3 .claude/skills/keenable-web-search/scripts/search.py "Python asyncio TaskGroup reference"
   ```

   You see numbered results, each with a title, a URL and a snippet of up to 400 characters:

   ```text Example output · results vary theme={"system"}
   1. Learn Python asyncio TaskGroup
      https://w3schools.in/python/asyncio-taskgroup
      `asyncio.TaskGroup` runs a related group of asynchronous tasks and waits for them as one structured unit...
   ```

3. Ask your agent a question that needs the web. The skill is loaded if your agent runs `scripts/search.py`.

If the script prints `Rate limited by the public endpoint. Try again shortly.`, your IP address reached the keyless limit. Wait and run it again.

## Other Keenable skills

| Skill | What it teaches your agent | Install |
| - | - | - |
| `keenable` | How to use Keenable from code: the SDKs, the MCP server, the REST API, limits and a research workflow. It has no script. | `npx skills add https://docs.keenable.ai` |
| `keenable-cli` | How to install and use the [Keenable CLI](https://docs.keenable.ai/cli.md). | Send your agent this prompt: `Read https://app.keenable.ai/SKILL.md and install this skill.` |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.