DonSeTch
Local web fetch, keyless multi-engine search, site crawl and screenshots in one Rust binary
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
Opens the app, which asks before it adds the server.
claude mcp add ketch -- npx -y ketch-cli mcp serve{
"mcpServers": {
"ketch": {
"command": "npx",
"args": [
"-y",
"ketch-cli",
"mcp",
"serve"
]
}
}
}{
"mcpServers": {
"ketch": {
"command": "npx",
"args": [
"-y",
"ketch-cli",
"mcp",
"serve"
]
}
}
}{
"servers": {
"ketch": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"ketch-cli",
"mcp",
"serve"
]
}
}
}[mcp_servers.ketch]
command = "npx"
args = ["-y", "ketch-cli", "mcp", "serve"]gemini mcp add --scope user ketch npx -- -y ketch-cli mcp serveKETCH_GITHUB_TOKEN secret |
Optional: GitHub token for the github code backend, falls back to GITHUB_TOKEN or GH_TOKEN. |
|---|---|
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. |
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.
| Runtime | Node.js 16+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
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`.
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.
5 only read, 1 can delete or overwrite. A ? marks an optional parameter.
searchquery: stringbackend?: stringmulti?: arrayrandom?: arraylimit?: integersearxng_url?: stringscrape?: booleantrim?: booleanmax_chars?: integertag?: stringcodequery: stringbackend?: stringlang?: stringrepo?: stringlimit?: integertag?: stringregexp?: booleandocsquery: stringbackend?: stringlibrary?: stringtokens?: integerlimit?: integertag?: stringresolve?: booleanscrapeurl?: stringurls?: arrayselector?: stringtrim?: booleanmax_chars?: integerno_cache?: booleanraw?: booleanforce_browser?: booleanno_llms_txt?: booleanconcurrency?: integertag?: stringcrawlurl: stringdepth?: integersitemap?: booleanmax_pages?: integerallow?: arraydeny?: arraymax_chars?: integerno_cache?: booleantag?: stringtag deletesoperation: enumtag?: stringlimit?: integerurls?: array