Stealth Chrome MCP server — 100++ tools for AI agents. One-liner Cloudflare Turnstile bypass (proven), dual-mode HTTP with TLS fingerprint, AI Vision reCAPTCHA solver. Python + nodriver + curl_cffi + FastMCP.
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in RobithYusuf/mcp-stealth-chrome
tools
-
auth_capture
Intercept the next N requests matching a URL pattern and return their headers (Authorization, Cookie, X-CSRF-*) — for SPAs that hold bearer tokens in JS memory
-
click_and_wait
Click + observe one of navigation / url / text / selector / request / network_idle. Distinguishes real submit from silent invalid-form click
-
click_at_corner
Click top-left/right/bottom-left/right of element
-
click_at_image
Find image + click its center
-
click_element_offset
Click at % position inside element (not center)
-
click_turnstile
CF Turnstile bypass for embed widgets + template-match fallback
-
console_clear
Reset captured console buffer
-
describe_page
Compact JSON summary (title/url/headings/fields/actions/errors/navigation) — ~10× fewer tokens than accessibility_snapshot. wait_stable=True waits for SPA hydration via MutationObserver
-
detect_and_bypass
One-shot: detect anti-bot wall (CF / DataDome / PX / Akamai / Imperva / Kasada) and apply best bypass we have
-
detect_anti_bot
Identify CF/DataDome/PerimeterX/Kasada/Imperva on current page
-
dialog_auto_handle
Persistent native-dialog handler with type filter (alert / confirm / prompt / beforeunload). Update action without re-arming. Idempotent per tab
-
emulate_cpu
1–6× CPU throttle (4× = DevTools default, 6× = low-end mobile)
-
emulate_device
Device presets: iphone-15, iphone-se, pixel-8, galaxy-s23, ipad, desktop
-
emulate_network
Preset throttles (offline / slow-3g / 3g / slow-4g / 4g / wifi) + custom
-
find_by_image
OpenCV template match → coordinates
-
fingerprint_rotate
UA/lang/platform/timezone via CDP
-
form_introspect
Per-field detail (label, framework binding react/vue/solid/lit, validation state, pattern/length constraints, aria-invalid)
-
http_request
TLS-perfect HTTP via curl_cffi (chrome/firefox/safari impersonation)
-
http_request_with_session
Authenticated curl_cffi request that piggybacks on browser cookies + auto-extracts most recent same-host bearer from network_index
-
http_session_cookies
Inspect which browser cookies match a URL
-
memory_heap_snapshot
V8 .heapsnapshot — drag into DevTools Memory panel
-
mouse_drift
Random Bezier wandering (pass behavioral ML)
-
paste_text
Full paste-event sequence (ClipboardEvent + DataTransfer + beforeinput inputType:'insertFromPaste') for SolidJS/Svelte 5/Qwik forms that ignore plain dispatchEvent('input')
-
performance_metrics
Runtime Performance.getMetrics (Nodes, JSHeap, TaskDuration, FPS…)
-
performance_timeline
TTFB / FCP / DOMContentLoaded / load + slowest 5 resources (instant, no trace capture)
-
session_warmup
Natural browsing pattern (homepage/referer/scroll) before target
-
smart_fill
Fill form by label text (fuzzy match: exact > prefix > substring > token); native value setter for React/Vue. Returns did_you_mean candidates on miss
-
solve_captcha
CapSolver API — Turnstile/reCAPTCHA/hCaptcha
-
solve_recaptcha_ai
Vision LLM picks matching tiles — solve image challenges (auto-clicks anchor checkbox in v0.2.10+)
-
spawn_browser
New named instance (parallel profiles)
-
verify_cf
Cloudflare checkbox via OpenCV template match
-
vision_locate
NL → element coordinates: "the red Create button at bottom right" (optional click=True)
-
wait_for_network_idle
SPA-safe load detection — waits for N ms of no fetch/XHR activity
-
wait_for_request
Block until a request matching url_pattern is observed (+ optional method filter, + optional response wait) — replaces setTimeout polling
-
web_vitals
Core Web Vitals via web-vitals v4 — LCP/CLS/INP/FCP/TTFB with pass/fail ratings
-
workflow_run
Sequential tool runner with resumable start_at index and stop_on_error. Failure response includes failure_context and resume_with hint
filesystem 3
- fs RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :17
from pathlib import Path - fs RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/state.py :16
from pathlib import Path - fs RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/vision.py :29
from pathlib import Path
shell / exec 2
- shell RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5991
import subprocess - shell RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/state.py :152
import subprocess
network 4
- net RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/captcha.py :13
import httpx - net RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :20
import httpx - net RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/network_http.py :32
from urllib.parse import urlparse - net RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/vision.py :32
import httpx
secrets 2
- secrets RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/captcha.py :35
api_key = api_key or os.environ.get("CAPSOLVER_KEY") - secrets RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/vision.py :209
legacy_key = os.environ.get("AI_VISION_API_KEY")
tool registrations 138
- browser_launch RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :378
- browser_close RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :722
- browser_recover RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :763
- navigate RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :909
- tab_focus RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :956
- go_back RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1010
- go_forward RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1021
- reload RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1032
- browser_snapshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1048
- screenshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1095
- get_text RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1269
- get_html RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1292
- get_url RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1309
- save_pdf RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1319
- click RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1342
- click_text RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1375
- click_role RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1389
- hover RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1408
- fill RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1425
- type_text RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1447
- press_key RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1487
- select_option RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1500
- check RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1518
- uncheck RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1524
- upload_file RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1549
- mouse_click_xy RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1571
- mouse_move RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1582
- drag_and_drop RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1597
- wait_for RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1631
- wait_for_navigation RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1651
- wait_for_url RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1662
- wait_for_response RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1679
- tab_list RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1726
- tab_new RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1753
- tab_select RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1767
- tab_close RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1781
- cookie_list RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1803
- cookie_set RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1933
- cookie_delete RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1951
- cookie_import RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :1968
- cookie_export RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2125
- localstorage_get RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2159
- localstorage_set RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2179
- localstorage_clear RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2193
- sessionstorage_get RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2204
- sessionstorage_set RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2228
- sessionstorage_clear RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2242
- cache_clear RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2253
- indexeddb_list RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2270
- indexeddb_delete RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2299
- evaluate RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2324
- inject_init_script RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2342
- inspect_element RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2361
- get_attribute RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2384
- query_selector_all RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2415
- get_links RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2434
- list_frames RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2457
- frame_evaluate RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2480
- batch_actions RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2514
- fill_form RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2559
- navigate_and_snapshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2578
- get_viewport_size RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2592
- set_viewport_size RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2607
- scroll RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2618
- scroll_to RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2658
- dialog_handle RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2712
- dialog_auto_handle RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2760
- accessibility_snapshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2839
- console_start RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2869
- console_get RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2906
- network_start RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2913
- network_get RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :2996
- server_status RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3068
- get_page_errors RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3086
- export_har RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3092
- detect_content_pattern RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3116
- extract_structured RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3155
- extract_table RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3213
- scrape_page RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3242
- storage_state_save RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3314
- storage_state_load RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3352
- solve_captcha RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3367
- verify_cf RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3416
- fingerprint_rotate RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3435
- humanize_click RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3466
- humanize_type RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3473
- click_turnstile RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3490
- click_element_offset RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3611
- click_at_corner RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3645
- find_by_image RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3679
- click_at_image RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3742
- mouse_drift RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3770
- mouse_record RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3803
- mouse_replay RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :3860
- spawn_browser RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4113
- list_instances RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4165
- switch_instance RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4199
- close_instance RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4215
- close_all_instances RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4249
- list_chrome_profiles RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4293
- clone_chrome_profile RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4345
- describe_page RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4643
- smart_fill RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4783
- assert_text_present RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4875
- assert_url_matches RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4903
- assert_element_visible RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :4926
- storage_snapshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5038
- storage_diff RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5055
- workflow_run RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5146
- detect_and_bypass RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5246
- paste_text RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5333
- auth_capture RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5443
- http_request_with_session RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5579
- wait_for_request RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5630
- click_and_wait RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5730
- form_introspect RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5941
- list_external_chrome RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :5984
- attach_to_chrome RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :6098
- detach RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/server.py :6169
- performance_trace_start RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :89
- performance_trace_stop RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :154
- performance_metrics RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :216
- performance_timeline RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :239
- web_vitals RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :295
- emulate_network RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :362
- emulate_cpu RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :400
- emulate_device RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :416
- coverage_start RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :455
- coverage_stop RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :484
- memory_heap_snapshot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :561
- wait_for_network_idle RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :629
- console_clear RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/devtools.py :696
- http_request RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/network_http.py :51
- http_session_cookies RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/network_http.py :158
- session_warmup RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/network_http.py :174
- detect_anti_bot RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/network_http.py :297
- solve_recaptcha_ai RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/vision.py :282
- vision_locate RobithYusuf-mcp-stealth-chrome-3aeb2c4/src/mcp_stealth_chrome/tools/vision.py :546
declared dependencies 6
- mcp@>=1.2.0
- nodriver@>=0.40
- pydantic@>=2.5
- httpx@>=0.27
- opencv-python@>=4.8
- curl-cffi@>=0.7