First-party web superpowers for AI agents: an open-source escalating web unlocker (browser-fingerprinted fetch -> JS-render relay -> stealth browser) for `read`, keyless multi-provider `search` with rank fusion, and subtitles-first video `transcribe`. CLI + MCP server + Claude Code skill. Keyless by default; optional platform helpers.
Project description
searchts
Give your AI agent eyes on the open web. searchts is a Python CLI and library that lets an AI agent read and search the internet, fronted by a fully open-source "unlocker" that gets through common bot-walls without any paid proxy or unlocker service.
License: MIT. Python 3.10+.
Fun fact: "searchts" doesn't officially abbreviate anything. Off the record, it stands for "search this shit". 🥀
Why
AI agents constantly need to read web pages, but the naive way they fetch is trivially blocked by modern anti-bot systems (Cloudflare, PerimeterX, DataDome). Paid unlocker services solve this, but the thing they really charge for is a large pool of clean residential IP addresses. searchts runs on your own machine, from your own connection, at personal volume, so it sidesteps that cost and gets through most of those walls for free.
The unlocker
searchts reads any URL through an escalating ladder and stops at the first tier that returns real content:
- curl_cffi: a fetch that impersonates a real Chrome's TLS/JA3 and HTTP2 fingerprint. Beats user-agent and fingerprint filters. Fast, local, private.
- Jina Reader: a JavaScript-rendering relay, for pages that only fill in content after running JS.
- stealth browser: an undetected headless Chromium (patchright), launched lazily only when the cheaper tiers fail, for live JS / Cloudflare managed challenges.
If every tier is defeated by an interactive CAPTCHA, an optional human-in-the-loop step opens a real browser so you can solve it once and continue. Block detection is phrase-based (not vendor-name based), so legitimate pages that merely embed a bot-sensor script are not falsely rejected. Content is extracted to clean Markdown with trafilatura.
Install
pipx install searchts # recommended: global, isolated CLI
# or
pip install searchts
# optional extras
pip install "searchts[browser]" && patchright install chromium # stealth-browser tier
pip install "searchts[mcp]" # MCP server for agents
Quickstart
searchts read https://example.com # fetch any page as clean Markdown
searchts search "open source vector db" # multi-provider web search (keyless by default)
searchts transcribe https://youtu.be/... # transcript of a YouTube/TikTok/Instagram/Reddit video
searchts doctor # see what is configured and working
read flags: --json, --backend <tier>, --human (CAPTCHA handoff), --scrub (redact injection).
search flags: -n <count>, --json, --provider <name>. Content goes to stdout (pipeable); status to stderr.
Use it from your AI agent
Two ways, both one command:
# 1) MCP: gives the agent always-on read_url + web_search tools
pip install "searchts[mcp]"
searchts mcp install # prints the wiring, e.g. for Claude Code:
# claude mcp add searchts -- searchts mcp serve
# 2) Slash command: type /searchts <url-or-query> in Claude Code
searchts skill install # writes ~/.claude/commands/searchts.md
Features
- Escalating open-source unlocker: curl_cffi, then Jina Reader, then a stealth browser.
- Multi-provider search with rank fusion: DuckDuckGo (keyless default), plus SearXNG, Exa, Brave, and Tavily when configured; results merged with reciprocal rank fusion and de-duplicated.
- Video transcription: yt-dlp audio plus Whisper for YouTube, TikTok, Instagram, and Reddit videos.
- Prompt-injection scrubbing: strips invisible/bidi characters, flags injection indicators, optional redaction, so untrusted page content is safer to feed a model.
- Per-domain backend memory: remembers which tier worked per domain and tries it first (
SEARCHTS_NO_MEMORY=1to disable). - Surfaces: a CLI, an MCP server (
read_url,web_search), and a Python library.
Use as a library
from searchts import unlocker
r = unlocker.fetch("https://example.com")
print(r.backend, r.status, r.text)
from searchts.search import search
for hit in search("open source vector db", max_results=5):
print(hit.title, hit.url)
How it works, and its limits
- It runs from your own residential IP at personal volume, which is why it needs no paid proxy pool. It is a personal-grade research tool, not a mass-scraping system.
- Interactive CAPTCHAs (DataDome / Turnstile press-and-hold) are the honest ceiling. Use
--humanfor those. - Some platforms (notably Instagram, and YouTube in 2026) may need your browser cookies or fail intermittently; that is platform-side.
- Anti-bot systems evolve; this is an arms race and the techniques may need occasional updates. Respect each site's terms of service and use responsibly.
Configuration
Search works with no keys (DuckDuckGo). Everything else is optional, via searchts configure or a .env (see .env.example):
- Search providers: Exa, Brave, Tavily API keys, or a self-hosted
SEARXNG_URL, for more and better results. - Transcription: a Groq or OpenAI (Whisper) key, plus
ffmpegandyt-dlp. - GitHub token for higher rate limits.
Run searchts doctor to check what is configured and working.
Optional integrations
The core is read / search / transcribe, and for most reads you can just
searchts read <the-url> on the public page. As an optional extra, if you have
separately-installed platform CLIs (gh, twitter-cli, opencli, mcporter),
searchts can also reach GitHub, Twitter/X, Reddit, and LinkedIn through them, and
searchts doctor will report which are present. These are add-ons, not the core.
Credits
searchts builds on and extends Agent-Reach (MIT), reusing its channel, installer, and diagnostics architecture. The escalating open-source unlocker, multi-provider search with rank fusion, prompt-injection scrubbing, per-domain backend memory, the human-in-the-loop CAPTCHA flow, the video transcript channels, the read_url / web_search MCP tools, and the read / search CLI commands are additions in searchts. Thanks to the original authors.
License
MIT. See LICENSE. Original portions Copyright (c) 2025 Agent Eyes; modifications and additions Copyright (c) 2026 capad-xyz.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file searchts-0.3.1.tar.gz.
File metadata
- Download URL: searchts-0.3.1.tar.gz
- Upload date:
- Size: 435.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1021281e7984c5a23464c7e1c5013057949f18331af61c58fd6414a0a2af464
|
|
| MD5 |
916b357740b858da781ae02023c10e43
|
|
| BLAKE2b-256 |
b6dad106046353caccc7f60b97fd23117db16a5e47e998dc92e649ae5d6a024d
|
Provenance
The following attestation bundles were made for searchts-0.3.1.tar.gz:
Publisher:
release.yml on capad-xyz/searchts
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
searchts-0.3.1.tar.gz -
Subject digest:
d1021281e7984c5a23464c7e1c5013057949f18331af61c58fd6414a0a2af464 - Sigstore transparency entry: 1864660524
- Sigstore integration time:
-
Permalink:
capad-xyz/searchts@a1272bd692047a106ca4dc107d37e7d9974f8e23 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/capad-xyz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a1272bd692047a106ca4dc107d37e7d9974f8e23 -
Trigger Event:
push
-
Statement type:
File details
Details for the file searchts-0.3.1-py3-none-any.whl.
File metadata
- Download URL: searchts-0.3.1-py3-none-any.whl
- Upload date:
- Size: 97.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e47e26519cfa9750717b16f094dbeb04a4fd77fb0768a9754cd5097b91abce5
|
|
| MD5 |
923e15d04c1fab08b793a88dcc8eaea4
|
|
| BLAKE2b-256 |
7b259c771a9dc57655c09f7d61a66399407477be56a8589d0a7bcfa44631e14a
|
Provenance
The following attestation bundles were made for searchts-0.3.1-py3-none-any.whl:
Publisher:
release.yml on capad-xyz/searchts
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
searchts-0.3.1-py3-none-any.whl -
Subject digest:
8e47e26519cfa9750717b16f094dbeb04a4fd77fb0768a9754cd5097b91abce5 - Sigstore transparency entry: 1864660540
- Sigstore integration time:
-
Permalink:
capad-xyz/searchts@a1272bd692047a106ca4dc107d37e7d9974f8e23 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/capad-xyz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a1272bd692047a106ca4dc107d37e7d9974f8e23 -
Trigger Event:
push
-
Statement type: