ketch

Web search, public code search, library docs and page-to-markdown scraping from one Go binary

By George Dikeakos (individual) Go Local · stdio Web searchBrowser automationDeveloper tools

48 popularity score ★ 742 ↓ 1.1k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add ketch -- npx -y ketch-cli mcp serve
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "ketch": {
      "command": "npx",
      "args": [
        "-y",
        "ketch-cli",
        "mcp",
        "serve"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "ketch": {
      "command": "npx",
      "args": [
        "-y",
        "ketch-cli",
        "mcp",
        "serve"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "ketch": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "ketch-cli",
        "mcp",
        "serve"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.ketch]
command = "npx"
args = ["-y", "ketch-cli", "mcp", "serve"]
Gemini CLITerminal
gemini mcp add --scope user ketch npx -- -y ketch-cli mcp serve

Settings 3

KETCH_GITHUB_TOKEN secret Optional: GitHub token for the github code backend, falls back to GITHUB_TOKEN or GH_TOKEN. For code.
KETCH_CONFIG Optional: Alternate config file instead of ~/.config/ketch/config.json. Every scalar config key can also be set as KETCH_ plus its upper-case name, such as KETCH_BRAVE_API_KEY, KETCH_PARALLEL_API_KEY, KETCH_CONTEXT7_API_KEY, KETCH_SEARCH_ORDER or KETCH_MCP_TOOLS.
KETCH_TAGS_PATH Optional: Full path of the bookmark index file. For tag.

What it does

ketch is a Go command-line program for research work, and `ketch mcp serve` runs it as a stdio MCP server. Over MCP it publishes six tools: web search across many providers, grep-style search of public open-source code, library documentation from Context7, scraping of HTML pages and text PDFs into markdown, same-host site crawling, and `tag`, a local bookmark index for keeping sources between sessions.

Which provider answers is decided in the config file, so the agent never has to pick. Web search starts in `auto` mode. It goes to your own SearXNG or Degoog instance first if you set one, then to any provider you gave a key, and only after that to the keyless hosted ones, starting with Parallel. A newer `search_order` setting (or `KETCH_SEARCH_ORDER` for one run) replaces that chain with your own list. Code search uses grep.app unless you switch to Sourcegraph or GitHub. Pages that need JavaScript can be rendered in headless Chrome, and fetched pages sit in a local cache for 72 hours by default.

Some things the README leaves out, read in the source. The `mcp_tools` setting is an allowlist, and a tool left off it is never registered (mcp/server.go). Search, code, docs, scrape and crawl each accept a `tag` argument that files every result into the bookmark index as it is fetched, so those tools can write to local storage too, although they are annotated read-only. A search returns 5 results unless `limit` or the config says otherwise. Batch scrapes run 5 fetches at once by default, at most 16, and a crawl stops at 30 pages by default and 100 at most, three levels deep unless `depth` is set (mcp/scrape.go, mcp/crawl.go, internal/configbase/config.go).

The pi package in the same repository adds `ketch_*` tools for the pi agent, which shell out to the CLI. Those are not MCP tools and the MCP server does not gain them.

What it needs

RuntimeNode.js 16+
Runs onmacOS, Windows, Linux
Also
  • Headless Chrome or Chromium for JavaScript-rendered pages (ketch browser install)

The npm package carries a prebuilt binary for macOS, Linux and Windows on x64 and arm64. Other platforms build from source with `go install`. Default web and code search need no key. The docs tool uses Context7, and the README lists a free key for it (`context7_api_key`). GitHub code search needs a GitHub token or `gh auth login`.

Limits

  • Rate limit Keyless hosted search providers are rate-limited. A provider key lifts their caps.
  • Not covered Scanned or image-only PDFs are not read unless you configure an external converter, whose output is capped at 10 MiB.
  • Limit Scrape and crawl accept only http and https URLs, and crawl stays on the seed URL's host.
  • Size cap A crawl stops after 30 pages by default and 100 at most, three levels deep unless depth is set.
  • Size cap Batch scrapes fetch 5 URLs at a time by default, capped at 16.
  • Not covered A local docs backend is listed as planned and not yet implemented, so docs relies on Context7.
  • Not covered Background crawls, cache clearing and config changes stay in the CLI and are not exposed over MCP.

Who it suits

Suits a developer who wants one local server for web search, open-source code lookup, library docs and page fetching, with no key to start and the option to point it at a self-hosted SearXNG or paid providers later. It is read-mostly: apart from local bookmarks it changes nothing. Pick something else if you need a browser you can click and type in (ketch only fetches and renders pages), search over your own files, or a hosted endpoint: ketch runs only as a local stdio process.

Tools 6

5 only read, 1 can delete or overwrite. A ? marks an optional parameter.

search
Web search through the configured or auto-chosen provider, optionally fetching each result as markdownquery: stringbackend?: stringmulti?: arrayrandom?: arraylimit?: integersearxng_url?: stringscrape?: booleantrim?: booleanmax_chars?: integertag?: string
code
Searches source code in public repositories via grep.app, Sourcegraph or GitHubquery: stringbackend?: stringlang?: stringrepo?: stringlimit?: integertag?: stringregexp?: boolean
docs
Looks up library documentation from Context7, or resolves a library name to its IDquery: stringbackend?: stringlibrary?: stringtokens?: integerlimit?: integertag?: stringresolve?: boolean
scrape
Fetches one or more HTML or PDF URLs and returns markdown or raw HTMLurl?: stringurls?: arrayselector?: stringtrim?: booleanmax_chars?: integerno_cache?: booleanraw?: booleanforce_browser?: booleanno_llms_txt?: booleanconcurrency?: integertag?: string
crawl
Crawls one host breadth-first or from a sitemap and returns each page as markdownurl: stringdepth?: integersitemap?: booleanmax_pages?: integerallow?: arraydeny?: arraymax_chars?: integerno_cache?: booleantag?: string
tag deletes
Adds, shows, lists and removes bookmarked sources in the local tag indexoperation: enumtag?: stringlimit?: integerurls?: array

Similar servers