tron automate: Obscura first, Chromium when the page needs it
TronBrowser now has an MCP server for agents that picks its engine per page. tron automate renders with Obscura first and hands the page to the Chromium session when Obscura is not enough. The same server runs hosted at tronbrowser.dev/mcp/tron, keyless, listed on openmcp.logicsrc.com.
Why two engines
I benchmarked both on the same pages before building anything. Obscura is a headless browser with its own renderer and a real V8. It starts in milliseconds and holds about 30 MB on a light page. Chromium cannot start in under 700 ms. So for example.com, Obscura answered in 63 ms and a cold Chrome took 774 ms.
Then the order flips. A GitHub repo page took Obscura 17 seconds and a warm Chromium 1.1 seconds. A Wikipedia article was 7.8 seconds against 0.45. Obscura's markdown conversion alone spent 5 seconds on the GitHub DOM. Only Chromium passes a real login or an interactive bot wall.
Neither engine is fastest. A router is.
What fetch_page does
fetch_page takes a URL and a format (markdown, text, links or html). With the default engine it asks Obscura over stdio with a 20 second budget, then falls back to Chromium when Obscura is missing, errors, runs out of time, or hands back a page that is plainly a wall or empty. It returns the page and one JSON line saying which engine answered and why the fallback ran. engine=obscura or engine=chromium pins one.
tron automate # MCP over stdio, for Claude Desktop or an IDE agent
tron automate serve # HTTP with an OpenMCP descriptor
tron automate fetch <url> # one-shot, prints markdown
tron automate status # which engines are usable
Obscura is two 100 MB binaries, so the release tarball does not carry it. The installer downloads the pinned release next to the launcher on install and on tron upgrade.
The hosted relay
tronbrowser.dev/mcp/tron is the same router inside the site's container, with the portable ungoogled-chromium build and Obscura baked into the image. It exposes fetch_page and screenshot_page only, opens a fresh tab per call and closes it, and refuses private targets by name and by what the name resolves to. Three pages render at once, thirty calls a minute per caller. The descriptor lives at tronbrowser.dev/.well-known/openmcp.json, so the catalog marks it verified.
Inside the container: Obscura fetched example.com in 60 ms, ungoogled-chromium rendered the GitHub page in 2 seconds, and the whole thing sat at 360 MB with Chromium warm.
One thing I found on the way
Obscura's HTTP MCP transport answers the first request on a connection in under 60 ms, then stalls every later request on that keep-alive connection by about 4 seconds. curl never shows it because each curl is a new connection. Over stdio there is no stall at all, which is why tron automate drives Obscura as a child process.
Docs: https://github.com/profullstack/tronbrowser.dev/blob/main/docs/mcp.md
Top comments (0)