Skip to main content
Glama

⚡ Thunder

The human engine for AI agents.

Give any software a human body: a real browser with a real fingerprint, a mouse that trembles like a hand, keystrokes at human cadence, and a TLS handshake indistinguishable from Chrome's.

A bot that walks like a person.

PyPI Python License: MIT Tests Fingerprint

Install · Watch the proof · MCP for any software


Why Thunder exists

Every anti-bot system on Earth looks for the same three tells:

  1. Protocol tells — a Python scraper's TLS/HTTP-2 handshake screams "bot" before a byte of JS runs.

  2. Fingerprint tells — navigator.webdriver, headless quirks, software-rendered WebGL, empty plugin arrays.

  3. Behavioral tells — perfectly straight mouse paths, instant typing, zero reading pauses.

Thunder is a body for your AI that has none of them. Not patched over — absent, the way a real human's browser is.

pip install thunder-agent
import thunder

body = thunder.Body(profile="ada")          # a persistent human named Ada
await body.warmup()                         # age the session like a returning user
await body.go("https://protected-site.com")
await body.type("#email", "ada@example.com")   # typed like a person. Typos included.
await body.look("proof.png")                    # screenshot evidence
await body.rest()                              # close, keep the identity

Ada comes back tomorrow with the same cookies, same screen, same GPU string, same timezone. The site sees a returning regular.


Related MCP server: Real Browser MCP

📦 Install in 30 seconds

pip install thunder-agent

Works on Linux, macOS, Windows. Real-Chrome engine auto-detected; falls back to bundled Chromium.

thunder demo        # watch it browse like a human, right now
thunder ghost https://nowsecure.nl    # TLS-level fetch that passes the gate

⚡ The five layers

Layer

What it does

The tell it kills

Body

Stealth browser: real Google Chrome, persistent profiles

headless shells, disposable identities

Skin

One consistent identity: UA, platform, GPU, screen, timezone, locale

fingerprint mismatches, SwiftShader WebGL

Hand

Bézier mouse with hand tremor, human keystroke cadence, typos it fixes

straight-line paths, machine-perfect timing

Ghost

Pure HTTP with Chrome's exact TLS/JA3 fingerprint + full header orchestration + human-style retries

Python-scrape handshake = instant 403

Pool

Thunder's own proxy pool: auto-fetched, Ghost-validated egress, sticky per profile

shared/flagged datacenter IPs

Warmup

Organic light browsing before your target

cold first-hit sessions

Verified live: bot.sannysoft.com under Thunder — WebDriver missing (passed) · WebDriver Advanced passed · Chrome present (passed) · PluginArray passed — 4 passed, 0 failed with headed real Chrome. Ghost pulls a 200 from a Cloudflare gate that 403s plain Python, same minute.


🔌 MCP: give ANY software a human body

Run the full Thunder app anywhere — one command, no account needed:

pip install thunder-agent[app]
thunder app

Thunder speaks: the Mouth gives it a real voice — Piper TTS as the primary offline engine (matured male voice) and Kokoro-82M for premium-quality narration, with edge-tts (natural male Christopher voice) as the online fallback and the default on small hosted instances where local engines would exhaust memory. During any mission you can hear Thunder narrate each step as it works, and the 🎙️ button lets you speak your mission instead of typing it.

The Thunder app is a desktop-grade web control room: mission control, a live monitor streaming real Chrome as it works, Autopilot (the Brain — StewMind 1.7b, falling back to Groq and Pollinations — plans each step and Thunder executes it on camera), and Recordings: every session's frames and step log are saved automatically, so you can replay exactly how Thunder navigated and did the task. With FIREBASE_API_KEY set it gains full accounts + per-user MCP tokens + cloud history; without it, it runs in local zero-setup mode.

Hosted MCP endpoint (connector URL for Claude): https://thunder-app-s94i.onrender.com/mcp — hosted on the live Thunder App (https://thunder-app-s94i.onrender.com). The same server serves the desktop-style web app, accounts, live video and recordings. You get thunder_search, thunder_read, thunder_ghost, thunder_feel, thunder_solve, thunder_open — search, clean extraction and bot-gate-safe fetches through Chrome's exact TLS handshake, from inside Claude.

Want the full human body (stealth Chrome, mouse tremor, human typing) under MCP? Run it locally — 15 tools, full parity with the hosted endpoint plus the browser-only ones:

Thunder ships an MCP server (15 tools). Paste one config and Claude, Cursor, Cline, Windsurf — anything that speaks MCP — browses as a human:

{ "mcpServers": { "thunder": {
    "command": "pipx", "args": ["run", "thunder-agent", "thunder-mcp"] } } }
{ "mcpServers": { "thunder": {
    "command": "uvx", "args": ["--from", "thunder-agent", "thunder-mcp"] } } }

Local tools (full set): `thunder_open`, `thunder_read`, `thunder_click`, `thunder_type`, `thunder_scroll`, `thunder_look`, `thunder_ghost`, `thunder_search`, `thunder_feel`, `thunder_captcha`, `thunder_challenge`, `thunder_human_read`, `thunder_identity`, `thunder_think`, `thunder_rest`. Hosted endpoint tools: `thunder_search`, `thunder_read`, `thunder_ghost`, `thunder_feel`, `thunder_solve`, `thunder_open` (guide for running the full body locally). Same core, same code — online and offline behave identically.

Tools: thunder_open · thunder_read · thunder_search · thunder_click · thunder_type · thunder_scroll · thunder_ghost · thunder_solve · thunder_feel · thunder_close — each one moves like a person, never like a script.


🚫 The blocker table — what used to stop bots, and Thunder's answer

Blocker

Thunder's counter

Datacenter IP suspicion

ProxyManager: sticky per-profile residential proxies, health-checked, auto-rotation — THUNDER_PROXY env or ProxyManager.from_env()

No GPU / software WebGL

Full WebGL1 and WebGL2 spoof: vendor + renderer read as a real consumer GPU, on every API path detectors use

Headless leaks

Headless-evasion pack: outerWidth/Height, colorDepth, broken-image dimensions, full window.chrome shape, battery API

Advanced CAPTCHAs

Keyless soft_solve (human-hand click inside challenges) + ocr_solve (local OCR for image/math) + CapSolver/2Captcha bridge for the hardest

Behavioral ML

Hand tremor + micro-corrections + warmup sessions + thinking pauses — entropy that reads as a person, because it moves like one

🔒 CAPTCHAs without a subscription

from thunder.captcha import soft_solve, ocr_solve
result = await soft_solve(body.page)     # human-hand click, no keys needed

Non-interactive challenges often pass on a warmed-up session. For Turnstile/reCAPTCHA Enterprise, wire your own CapSolver or 2Captcha key — Thunder senses the challenge type and routes it.

v0.5 — ChallengeResolver, Thunder's own bypass system (no external deps):

from thunder.captcha import ChallengeResolver
verdict = await ChallengeResolver().resolve(body.page, body=body)
# {'solved': True, 'kind': 'turnstile', 'how': 'human-timed checkbox click'}

Detects the challenge type — Turnstile, reCAPTCHA v2, hCaptcha, Amazon's text captcha, Cloudflare interstitials — and runs the built-in counter: hand-timed checkbox clicks, patience for interstitials, local OCR for Amazon (retrying like a person squinting). No paid keys, no subscriptions.


🫆 Wear YOUR OWN fingerprint

The headline feature of v0.5. Open https://browserleaks.com in your normal browser, copy your values, and Thunder wears your machine's ghost — same UA, GPU strings, screen, cores, RAM, timezone, languages:

from thunder.fingerprint import Skin
from thunder.body import Body

me = Skin.imitate({
    "user agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...",
    "gpu renderer": "ANGLE (Apple, ANGLE Metal Renderer: Apple M2, ...)",
    "timezone": "Europe/London", "screen": "2560x1440",
})
body = Body(skin=me)            # your machine's ghost

Or from the terminal:

thunder identity --out my.json        # export the live fingerprint
thunder identity --imitate my.json    # wear it and verify live

Partial data is fine — anything missing stays Thunder-consistent. An imitated skin is mutually consistent: your Mac UA will never claim a Windows GPU.


📖 Reads like a human too

await body.read_like_human(seconds=15)   # burst-scroll, reading pauses,
                                         # idle drift, re-reads

Behavioral ML scores dwell patterns. Thunder gives pages a genuine reading signature — pauses at paragraph speed, hands that drift while "reading", occasional scroll-backs.


🧠 Pair with any mind

Thunder is the body; bring any brain. Works with stewmind, Ollama, LM Studio, vLLM, OpenAI-compatible APIs, or fully offline transformers.

from thunder.mind import Mind
mind = Mind(provider="ollama", model="llama3")
plan = await mind.think("find the pricing page and extract the tiers", body)

🧪 Tested, not promised

git clone https://github.com/emmanuelerogian723-alt/thunder
cd thunder && pip install -e ".[dev]" && pytest

Stealth regression suite: webdriver erased + scan-invisible · genuine PluginArray · headless pack · WebGL skin-consistency · proxy rotation. Each one fails loudly if a future commit breaks the human illusion.


⚖️ The honest limits (why people trust Thunder)

  • No tool on Earth is "undetectable." Anyone selling that is lying to you.

  • Cloud IPs still look like clouds — pair Thunder with a residential proxy for the hardest targets.

  • Google-scale behavioral ML scores the whole session. Thunder's warmup + hand give you a real chance; it's not a magic key.

  • Use Thunder only where you're authorized. Your accounts, your tests, your sites. That's the license, and it's the line.

MIT licensed. Built in the open — every claim on this page has a script in tests/ or a screenshot in proofs/.


Watch Thunder beat the bot-detection gauntlet, live:

https://emmanuelerogian723-alt.github.io/thunder/

⭐ If this saved you a month of anti-detect work, star the repo — it helps others find it.

Thunder — built so software can finally act human. 🌩️

Available Tools

15 tools
thunder_captchaB

Detect CAPTCHA challenges on the current page.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does not say what detection returns, whether it interacts with the page, how reliable detection is, or what an agent should do after detection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. It is appropriately sized for the amount of information it contains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a detection tool with no annotations and no output schema, the description omits essential context such as the return value and recommended next step. An agent would need to call it blindly to learn what "detect" actually produces.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter meanings to explain. This is the expected baseline for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Detect") and resource ("CAPTCHA challenges") scoped to the current page. It is clear what the tool does, though it does not differentiate itself from the sibling thunder_challenge tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as thunder_challenge. Usage is only implied by the phrase "on the current page".

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_challengeB

Detect and counter any CAPTCHA/challenge on the current page (Turnstile/reCAPTCHA/hCaptcha/Amazon/CF interstitial) — keyless.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully notes that the tool is "keyless" and lists supported challenge types, but it does not explain whether it solves or merely counters challenges, whether it blocks, what permissions or side effects are involved, or what the agent should expect after invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted language. It gives the main action, scope, supported challenge types, and keyless constraint efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no annotations and no output schema, the description covers the essential scope and challenge types but leaves important behavioral details unclear. An agent still does not know what "counter" entails, whether the operation is automatic, or what result to expect, making the definition only minimally complete for this kind of browser challenge handler.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to explain. The description does not need to compensate for undocumented inputs, and the baseline for a no-parameter tool is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ("Detect and counter") and resource ("CAPTCHA/challenge on the current page"), and it enumerates concrete challenge types such as Turnstile, reCAPTCHA, hCaptcha, Amazon, and CF interstitial. It is clear what the tool does, but it does not differentiate itself from the sibling tool thunder_captcha, so an agent cannot tell from the description alone when this tool is preferable to that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when a CAPTCHA or challenge is present on the current page, which gives the agent a basic usage condition. However, it provides no explicit when-not guidance, no prerequisites, and no comparison to alternatives such as thunder_captcha, leaving the agent to infer the correct context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_clickC

Click like a human (bezier mouse path + human timing).

NameRequiredDescriptionDefault
selectorYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the click uses a Bezier mouse path and human timing, which is meaningful behavioral context beyond the schema. However, it does not state whether the click is destructive, whether it waits for navigation, how failures are handled, or what permissions are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler: it states the action first and adds the human-like behavior parenthetically. It is efficient, though the parenthetical could be slightly clearer about whether it applies to all clicks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one required parameter, no annotations, no output schema, and 0% schema description coverage, the description is too sparse. It explains the human-like click behavior but omits selector semantics, side effects, usage context relative to many siblings, and failure behavior, leaving key information missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required parameter, 'selector', with 0% schema description coverage, so the description must compensate. The description never mentions the selector, its format, what it targets, or how it is resolved, leaving the only parameter undocumented in both schema and prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and action: 'Click like a human', which clearly distinguishes it from siblings like thunder_type, thunder_read, or thunder_scroll. It does not explicitly name or differentiate from closer alternatives such as thunder_open, but the core purpose is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as thunder_open or thunder_type, nor any exclusions or prerequisites. The agent must infer its usage context solely from the tool name and one-line description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_feelC

Probe a URL's bot posture: plain request vs thunder ghost (TLS-true) request.

NameRequiredDescriptionDefault
urlYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It implies two outbound network requests but says nothing about safety, side effects, rate limiting, auth requirements, or what the probe reports back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no filler, which is good structurally. But the brevity tips into under-specification, leaning on undefined internal terminology instead of explaining the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description is the only source of behavioral information, yet it does not explain what the probe returns (detection verdict? per-mode comparison?) or how the two results are presented. This is a significant gap for a diagnostic tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single 'url' parameter, and the description provides no compensation: no format, no constraint (e.g., must be absolute, http/https only), and no explanation of whose URL perspective the request originates from.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action (probing a URL's bot posture) and distinguishes two modes (plain request vs 'thunder ghost' TLS-true request). However, 'thunder ghost' is undefined jargon that overlaps with the sibling tool thunder_ghost, so an agent cannot fully tell what this tool does differently from that sibling without inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus thunder_ghost, thunder_challenge, or thunder_open. The description only states what is compared, not the conditions or scenarios that should trigger this probe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_ghostB

Fetch a URL with a real browser TLS fingerprint (curl_cffi).

NameRequiredDescriptionDefault
urlYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It identifies the underlying curl_cffi approach and TLS fingerprinting, which is useful, but does not disclose read-only nature, redirect behavior, response format, timeout/rate limits, or that curl_cffi does not execute JavaScript.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with no filler. Every phrase adds some signal, even though the overall description is under-specified in other dimensions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description should carry more weight about behavior and return expectations. It covers the core mechanism but leaves out important operational details such as response shape, limitations, and error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one required URL parameter and schema description coverage is 0%. The description only repeats 'URL' and adds no details about accepted protocols, format, normalization, or whether the URL must be absolute.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Fetch) and resource (URL), and adds a differentiating trait: a real browser TLS fingerprint via curl_cffi. It does not explicitly distinguish from siblings such as thunder_rest, thunder_open, or thunder_read, which may also retrieve URLs, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'real browser TLS fingerprint' implies usage when anti-bot TLS fingerprinting matters, but it does not state when to choose this over sibling fetch tools or when it is inappropriate. Guidance is present only by implication.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_human_readC

Read the current page like a human: burst scroll, reading pauses, idle hand drift.

NameRequiredDescriptionDefault
secondsNo

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose meaningful behavior: burst scrolling, reading pauses, and idle hand drift signal this is a time-consuming human-simulation routine. But it omits whether it is read-only, what side effects occur on the page, and what it returns, leaving key behavioral questions unanswered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly written sentence that is front-loaded with the verb and resource and wastes no words. Every element (burst scroll, pauses, drift) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and an undocumented parameter, the description should do more. It explains the simulation style but says nothing about what the call produces or how the seconds duration shapes the operation, leaving meaningful gaps for a human-behavior tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'seconds' parameter (default 12) is never mentioned in the description, even though duration is central to a timed human-simulation routine. The description gives no meaning or units guidance beyond what the bare schema shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('the current page') plus concrete mechanics (burst scroll, pauses, idle drift). However, it does not distinguish itself from siblings like thunder_read, thunder_look, or thunder_scroll, and it is ambiguous whether 'read' returns page content or merely simulates human interaction behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus thunder_read, thunder_look, or thunder_scroll, and no prerequisites or exclusions are stated. The agent must infer the intended use case from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_identityB

Export the live fingerprint, or wear one from a fingerprint JSON file (Skin.imitate).

NameRequiredDescriptionDefault
imitate_fileNo

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It names export and wear modes but omits whether wearing a fingerprint mutates persistent state, required permissions, reversibility, error behavior, or effects on later browser actions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler packs both modes and the file source into minimal text. The parenthetical is the only potentially cryptic element, but it does not add wasted length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description covers the two operating modes and the file input at a basic level. However, with no annotations or output schema, it should say more about what export returns and what changes when a fingerprint is worn; as written it is only minimally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one optional parameter and 0% schema description coverage, so the description must explain imitate_file. It identifies the argument as a fingerprint JSON file and implies omission triggers export mode, but it does not document path format, expected JSON structure, or validation behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states two concrete actions: exporting the live fingerprint and wearing one from a fingerprint JSON file, with a parenthetical tying the latter to Skin.imitate. It is clear enough to distinguish the tool from generic browser actions, though it does not explicitly contrast with closer siblings such as thunder_ghost.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'or' construction implies that supplying a file switches from export mode to imitate mode, but it does not state when an agent should choose this tool versus alternatives or what preconditions apply. Usage is inferable rather than instructed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_lookA

Take a screenshot of the current page; returns the file path.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It does disclose that the tool returns a file path, which is useful, but it does not state whether the screenshot covers the viewport or the full page, what image format is used, or whether the operation waits for page load.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the action and then states the return value. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter visual inspection tool with no output schema, the description gives enough to call it and know the return type. It could be more complete by specifying whether the capture is viewport-only or full-page, but the core call is unambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain. The baseline for zero-parameter tools applies, and the description correctly avoids inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: taking a screenshot of the current page. This clearly distinguishes 'look' from reading via thunder_read or thunder_human_read, but it doesn't explicitly name alternatives, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the phrase 'current page,' but the description never says when to prefer thunder_look over thunder_read or thunder_human_read. No exclusions or alternative tool guidance are provided, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_openC

Open a URL in Thunder's human-shaped browser body.

NameRequiredDescriptionDefault
urlYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether opening a URL is read-only, whether it waits for page load, what side effects occur, or what is returned—only that a URL is opened.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with the action and main input front-loaded. The odd phrase 'human-shaped browser body' adds some ambiguity but does not bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and many browser-automation siblings, the description is too thin for an agent to confidently invoke the tool. It omits return behavior, error cases, and how it relates to tools like thunder_rest or thunder_read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter at 0% description coverage, but the description minimally identifies it as a URL. It does not add format details such as scheme requirements, but the single obvious parameter keeps the gap small.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Open') and resource ('URL'), but 'in Thunder's human-shaped browser body' is vague and does not clearly differentiate it from siblings such as thunder_rest or thunder_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like thunder_rest, thunder_read, or thunder_search. The only implied usage is that it opens a URL, with no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_readB

Read the current page: title, url, text, clickable elements.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It implies a read-only operation and lists return fields, but does not state permissions, side effects, or detailed return behavior beyond those fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no waste. It states the action and the return contents efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument read tool, the description is adequate for invocation because no parameters are needed and it names the returned fields. However, it does not help the agent choose among sibling tools or add behavioral context that an output schema or annotations would otherwise provide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to explain; the baseline for zero-param tools is 4. The description does not need to compensate for any schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: "Read the current page," and lists what will be returned (title, url, text, clickable elements). It is clear but does not differentiate itself from similar siblings such as thunder_look or thunder_human_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, and no when-not conditions. The only usage cue is the implied context of reading the current page.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_restB

Close the body. Cookies/fingerprint persist for next time.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose one meaningful trait: cookies and fingerprint persist for the next session, so closing does not wipe state. It says nothing about whether the close is immediate, what happens to in-flight page state, or whether it is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action, with the persistence note second. Nothing is wasted, though the extreme terseness contributes to the ambiguity of 'body'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output tool the definition needs only to be unambiguous about effect, and the persistence note is a genuinely useful addition. The residual gap is what 'close' actually ends (page vs. entire session) relative to the other thunder_* tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no argument semantics to explain; the description is not misleading about inputs. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Close the body" is a verb plus an ambiguous object — it does not plainly say it ends the browser session/page, an inference helped only by the presence of the sibling thunder_open. An agent can guess it is the counterpart to opening, but the metaphor 'body' makes the resource unclear without prior knowledge of the toolkit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus thunder_open or any other sibling, and no prerequisite or exclusion is given. The only usage signal is the implied 'when done' framing, which the agent has to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_scrollC

Scroll with human easing and reading pauses.

NameRequiredDescriptionDefault
amountNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses a useful trait—human-like easing and reading pauses—but says nothing about direction, whether scrolling is bounded, whether it waits for content to load, or what side effects it has on page state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no filler and the key action is front-loaded. It is under-specified rather than verbose, which is a completeness issue, but from a conciseness standpoint it wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and an undocumented parameter, the description is too thin for reliable invocation. It does not cover return behavior, boundaries, or how the single parameter affects the operation, leaving an agent without enough context to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter "amount" (default 600), and the description never mentions it. It does not clarify units (pixels? lines? percent), direction, or what the default represents, so the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb "scroll" is specific, but the description never names the target (page, element, viewport) or scope, and the phrase "human easing and reading pauses" describes manner rather than the resource acted on. It provides no differentiation from siblings such as thunder_human_read or thunder_read, leaving the agent to infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no indication of when to use this tool versus the many sibling tools, no prerequisites, and no exclusions. An agent must guess whether this is for general page movement, reading assistance, or something else entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_thinkC

Ask stewmind-1.7b for the next action toward a goal.

NameRequiredDescriptionDefault
goalYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses only that a model is queried, but says nothing about whether the call is read-only, what the return value looks like, how long it may take, or whether the returned 'next action' is text, a command, or something else.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler, which is appropriately concise. Its brevity is not wasted, though it leaves important specifics unstated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's role as a planning step among concrete action tools, the description should explain how the returned action relates to the sibling tools. With no output schema and no annotations, it leaves critical context missing: what the model returns, how to interpret it, and how to proceed after calling this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'goal' has 0% schema description coverage, so the description must compensate. It merely repeats the word 'goal' without explaining format, level of detail, or examples. This gives no additional meaning beyond the parameter name itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: querying a named model (stewmind-1.7b) for a next action toward a goal. This distinguishes it from sibling tools like thunder_click or thunder_open, which perform concrete operations rather than planning. The only weakness is that 'stewmind-1.7b' is unexplained, leaving some ambiguity about what kind of system is being asked.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies the tool is used when a goal needs a next action, but there is no explicit when-to-use guidance, no exclusions, and no reference to alternatives among the many thunder_* action tools. An agent must infer the planning role without being told whether to call this before or after the sibling action tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thunder_typeB

Type like a human (inter-key delays, rare typos, pauses).

NameRequiredDescriptionDefault
textYes
selectorYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does disclose useful traits: inter-key delays, rare typos, and pauses. However, it omits important behavior such as whether the selector is focused first, whether existing text is replaced or appended, whether injected typos are corrected, and what side effects occur on the page.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. The parenthetical details add useful behavioral context efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two required parameters, no annotations, no output schema, and 0% schema description coverage, the description is too sparse. It explains the human-like typing style but leaves the selector semantics, text behavior, and element interaction details undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate but does not mention either required parameter. It vaguely implies a text input through the verb 'Type', but gives no meaning for 'selector' or whether text replaces or appends to existing content.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb, 'Type', and adds behavioral qualifiers: human-like inter-key delays, rare typos, and pauses. This distinguishes it from sibling actions like click, scroll, or open, though it does not clarify the target element context beyond the schema's selector parameter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The human-like typing phrase implies when this tool might be preferred, but there is no explicit guidance on when to use it versus alternatives or when not to use it. No prerequisites or alternative tools are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.6.1
    • First observedthunder_captcha
    • First observedthunder_challenge
    • First observedthunder_click
    • First observedthunder_feel
    • First observedthunder_ghost
    • First observedthunder_human_read
    • First observedthunder_identity
    • First observedthunder_look
    • First observedthunder_open
    • First observedthunder_read
    • First observedthunder_rest
    • First observedthunder_scroll
    • First observedthunder_search
    • First observedthunder_think
    • First observedthunder_type

TDQS

B3/5.0

Scored across 15 tools

Disambiguation3/5

Most tools are distinct, but several pairs overlap: thunder_read vs thunder_human_read, thunder_captcha vs thunder_challenge, and thunder_ghost/thunder_feel/thunder_search all involve browser-TLS fetching. thunder_rest is especially unclear as a name for closing the browser body.

Naming Consistency3/5

The thunder_ prefix is consistent, but suffixes mix verbs (open, read, click) with nouns (captcha, identity, challenge, ghost) and compounds (human_read). Some names like thunder_rest and thunder_feel are cryptic about what they actually do.

Tool Count4/5

15 tools is reasonable for a stealth browser automation server covering navigation, interaction, fingerprinting, CAPTCHA handling, search, and planning. There is slight redundancy in the CAPTCHA and page-reading tools, but the count is not excessive.

Completeness4/5

Core browser lifecycle is covered: open, read, click, type, scroll, screenshot, and close. It also adds fingerprinting, search, CAPTCHA handling, and a reasoning helper; minor gaps like tab management, navigation history, or explicit waits are workaroundable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides a real browser that bypasses bot detection (Cloudflare, Turnstile) for AI agents, enabling navigation, clicking, typing, screenshots, and data collection through MCP tools.
    84 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to automate a real Chromium browser through the unchanged upstream Playwright MCP tool surface, covering navigation, research, testing, and daily web workflows in plain language. It ships via npm or Docker over stdio or Streamable HTTP, and supports persistent login profiles, Chrome extension loading, proxy/GeoIP matching, and humanized mouse, keyboard, and scroll behavior.
    826 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP-compatible AI agents to drive an anti-detection browser for navigation, interaction, search, extraction, downloads, and persistent multi-tab sessions across 47 tools. Connects over stdio or HTTP to a separately running browser server, letting agents automate the web without getting blocked.
    201 npm
    MIT