Thunder — the human engine for AI agents
⚡ THUNDER
A body, a skin, a human hand, a ghost, and a mind — for any AI agent.
pip install thunder-agent · MCP-native · Powered by stewmind-1.7b
AI agents browse like robots and get blocked. Thunder gives an agent a human-shaped presence on the web:
| Layer | What it is | How |
|---|---|---|
| 🦾 Body | a stealth browser session | Playwright engine + persistent profiles, zero heavy deps |
| 🎭 Skin | a consistent device fingerprint | UA / platform / screen / WebGL / canvas-noise, saved per profile so the same human returns |
| ✋ Hand | human motion | bezier-curve mouse with overshoot, Fitts-law clicks, lognormal keystrokes with typos, eased scroll, idle drift |
| 👻 Ghost | protocol-level body | curl_cffi — a real browser's TLS (JA3/JA4) + HTTP/2 shape, no browser needed |
| 🧠 Mind | the thought layer | stewmind-1.7b (or ANY model: Ollama, LM Studio, vLLM, GPT, HF) returns strict JSON next-actions |
| 👁️ Vision | eyes that understand | route screenshots to any vision model |
| 🛡️ CAPTCHA bridge | detect → avoid → solve | senses challenges; plugs into your CapSolver/2Captcha key on your own accounts |
| 🔌 MCP server | any agent can drive it | Claude Desktop, Cursor, STEW, anything that speaks MCP |
Quickstart
pip install thunder-agent
thunder browse https://example.com # human-shaped browsing
thunder ghost https://nowsecure.nl # TLS-true fetch
thunder demo # full showcase
import thunder, asyncio
async def main():
body = thunder.Body(profile="ada") # persistent human
await body.wake("https://en.wikipedia.org")
await body.type("#searchInput", "lightning") # types like a person
print(await body.read()) # structured page for your LLM
await body.rest()
asyncio.run(main())
Pair with ANY model (local or remote)
from thunder.mind import StewMind
mind = StewMind.backend_ollama("stewmind:1.7b") # fully offline
mind = StewMind(endpoint="http://localhost:1234/v1") # LM Studio / vLLM
mind = StewMind.backend_huggingface() # stewmind on HF
mind = StewMind.backend_local() # transformers, offline
mind = StewMind(endpoint="https://api.openai.com/v1",
model="gpt-4o-mini", api_key=KEY) # any OpenAI-compatible
plan = mind.think(goal="log in and download the invoice",
page=await body.read())
# {"action": "type", "target": "#email", "value": "…", "reason": "…"}
Offline pairing: OLLAMA_HOST + OLLAMA_MODEL (or STEWMIND_LOCAL=1)
are auto-detected. stewmind-1.7b runs on a laptop CPU/GPU.
MCP — give every agent a human body
Copy-paste configs (Thunder is on PyPI):
{ "mcpServers": { "thunder": {
"command": "pipx", "args": ["run", "thunder-agent", "thunder-mcp"] } } }
{ "mcpServers": { "thunder": {
"command": "uvx", "args": ["--from", "thunder-agent", "thunder-mcp"] } } }
Any OpenAI-style config, any software that speaks MCP — Thunder gives it a human body.
Tools: thunder_open, thunder_read, thunder_click, thunder_type,
thunder_scroll, thunder_look, thunder_ghost, thunder_captcha,
thunder_think, thunder_rest.
CAPTCHAs, honestly
- Avoid: good skin + human hand + clean IP avoids most challenges.
- Detect:
thunder_captchareports type + sitekey. - Solve: bring your own solver key (
CAPSOLVER_API_KEY/TWOCAPTCHA_API_KEY) for your own accounts. - Vision (experimental):
describe_image()routes challenges to a vision model you choose.
Thunder is not a mass-solving service.
Run it in the cloud (or on your box)
docker build -t thunder .
docker run -p 8000:8000 thunder # or run natively, fully offline
Responsible use
Thunder is for agents acting on systems and accounts their operator is authorized to use: QA, testing, personal automation, public-data research. Not for fraud, mass account abuse, or deceiving people. Respect site ToS.
MIT © 2026 Emmanuel Ene Rejoice · MUTYINT · Nigeria 🇳🇬
Metadata
Release files for thunder-agent 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| thunder_agent-0.2.1.tar.gz | 27.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| thunder_agent-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.3 kB
Release files / thunder_agent-0.2.1.tar.gz
| Download URL | thunder_agent-0.2.1.tar.gz |
|---|---|
| Size | 27.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b2fea41acca3e1a97e68fc9388fbd9b7d5b505e1eec1996dfb16d0328fa4c765
|
|
BLAKE2b-256 checksum How to use checksums |
7c0c0ca05ff4787ea8f4161cddb8cbabf2ef8bc396c798fc39bc39683b888bac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Release files / thunder_agent-0.2.1-py3-none-any.whl
| Download URL | thunder_agent-0.2.1-py3-none-any.whl |
|---|---|
| Size | 28.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6cfad63f35be1655fe7fc217ab1e94ddb4ed9b53988841d19930451e9db0cc4a
|
|
BLAKE2b-256 checksum How to use checksums |
7687ab333c488bfd9d72e69388b2705856bd69d68c6c616172c64b5562bf08ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Security for thunder-agent 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.