MCP + A2A Native
First-class Model Context Protocol server. Connect from Claude, GPT, LangChain, CrewAI, or any A2A-compatible agent framework with a single config.
Give your agent real browser access with MCP, REST, or Playwright. Sub-100ms cold starts. Stealth by default. Built for the agentic web.
First-class Model Context Protocol server. Connect from Claude, GPT, LangChain, CrewAI, or any A2A-compatible agent framework with a single config.
AI-friendly API tools: navigate by text, click by description, fill forms by label. Your agent describes what it wants — we handle the selectors.
Your agent gets a live browser before the next API call fires. No waiting, no queuing — purpose-built for real-time agentic workflows.
Every session gets advanced anti-detection: custom fingerprints, realistic TLS, human-like behavior patterns. No configuration needed.
Extract page content as clean markdown with metadata. Perfect for RAG pipelines, knowledge bases, and data gathering agents.
Maintain browser state across multiple agent steps. Cookies, localStorage, and auth sessions persist — no re-login between actions.
Use the Humanized REST tools (the same primitive operations MCP clients call) to open a remote session, navigate, and extract markdown.
const apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };const post = (path: string, body: unknown) => fetch("https://api.browser.city" + path, { ...opts, body: JSON.stringify(body) }).then((r) => r.json());const open = await post("/v1/do/open", { browser: "chromium" });const sessionId = open.result;await post("/v1/do/navigate", { sessionId, url: "https://example.com" });const md = await post("/v1/do/markdown", { sessionId });console.log(md.result);import osimport requestsapi_key = os.environ["BROWSERCITY_API_KEY"]headers = {"Authorization": f"Bearer {api_key}"}base = "https://api.browser.city"post = lambda path, payload: requests.post(base + path, headers=headers, json=payload).json()open_res = post("/v1/do/open", {"browser": "chromium"})session_id = open_res["result"]post("/v1/do/navigate", {"sessionId": session_id, "url": "https://example.com"})md = post("/v1/do/markdown", {"sessionId": session_id})print(md["result"])using System.Net.Http.Headers;using System.Net.Http.Json;var apiKey = Environment.GetEnvironmentVariable("BROWSERCITY_API_KEY")!;var http = new HttpClient();http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);var open = await http.PostAsJsonAsync( "https://api.browser.city/v1/do/open", new { browser = "chromium" });var openJson = await open.Content.ReadFromJsonAsync<DoResponse>() ?? throw new Exception("bad response");var sessionId = openJson.result;await http.PostAsJsonAsync( "https://api.browser.city/v1/do/navigate", new { sessionId, url = "https://example.com" });var md = await http.PostAsJsonAsync( "https://api.browser.city/v1/do/markdown", new { sessionId });var mdJson = await md.Content.ReadFromJsonAsync<DoResponse>() ?? throw new Exception("bad response");Console.WriteLine(mdJson.result);public record DoResponse(string result);import java.net.URI;import java.net.http.*;var apiKey = System.getenv("BROWSERCITY_API_KEY");var auth = "Bearer " + apiKey;var http = HttpClient.newHttpClient();var openReq = HttpRequest.newBuilder() .uri(URI.create("https://api.browser.city/v1/do/open")) .header("Authorization", auth) .POST(HttpRequest.BodyPublishers.ofString("{\"browser\":\"chromium\"}")) .build();var openRes = http.send(openReq, HttpResponse.BodyHandlers.ofString());var sessionId = extractResult(openRes.body());var navReq = HttpRequest.newBuilder() .uri(URI.create("https://api.browser.city/v1/do/navigate")) .header("Authorization", auth) .POST(HttpRequest.BodyPublishers.ofString( "{\"sessionId\":\"" + sessionId + "\",\"url\":\"https://example.com\"}")) .build();http.send(navReq, HttpResponse.BodyHandlers.discarding());var mdReq = HttpRequest.newBuilder() .uri(URI.create("https://api.browser.city/v1/do/markdown")) .header("Authorization", auth) .POST(HttpRequest.BodyPublishers.ofString( "{\"sessionId\":\"" + sessionId + "\"}")) .build();var mdRes = http.send(mdReq, HttpResponse.BodyHandlers.ofString());System.out.println(extractResult(mdRes.body()));static String extractResult(String json) { // Use your preferred JSON library. This is intentionally minimal. var i = json.indexOf("\"result\""); if (i < 0) return ""; var start = json.indexOf('"', i + 8); var end = json.indexOf('"', start + 1); return start >= 0 && end > start ? json.substring(start + 1, end) : "";} Free tier. No credit card. Full stealth from day one.