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 via MCP, REST, or Playwright. Instant cold starts. Bulletproof 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.
HTTP browser actions for agents that need to open sessions, navigate, click, type, fill forms, and extract page content without running Playwright.
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 actionUrl = (action: string) => `https://api.browser.city/v1/do/${action}`;const doAction = (action: string, body: unknown) => fetch(actionUrl(action), { method: 'POST', headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify(body), }).then((r) => r.json());const opened = await doAction('open', { browser: 'chromium' });try { await doAction('navigate', { sessionId: opened.sessionId, url: 'https://example.com' }); const page = await doAction('markdown', { sessionId: opened.sessionId }); console.log(page.result);} finally { await doAction('close', { sessionId: opened.sessionId });}import os, requestsAPI_BASE = 'https://api.browser.city/v1/do'def do_action(action, body): return requests.post( f'{API_BASE}/{action}', headers={'Authorization': f"Bearer {os.environ['BROWSERCITY_API_KEY']}"}, json=body, ).json()opened = do_action('open', {'browser': 'chromium'})try: do_action('navigate', {'sessionId': opened['sessionId'], 'url': 'https://example.com'}) page = do_action('markdown', {'sessionId': opened['sessionId']}) print(page.get('result'))finally: do_action('close', {'sessionId': opened['sessionId']})using System.Net.Http.Headers;using System.Net.Http.Json;using System.Text.Json.Nodes;var http = new HttpClient();var apiBase = new Uri("https://api.browser.city/v1/do/");http.DefaultRequestHeaders.Authorization = new( "Bearer", Environment.GetEnvironmentVariable("BROWSERCITY_API_KEY"));async Task<JsonNode?> Do(string action, object body) => await (await http.PostAsJsonAsync( new Uri(apiBase, action), body)).Content.ReadFromJsonAsync<JsonNode>();var opened = await Do("open", new { browser = "chromium" });try { await Do("navigate", new { sessionId = (string?)opened!["sessionId"], url = "https://example.com" }); var page = await Do("markdown", new { sessionId = (string?)opened!["sessionId"] }); Console.WriteLine((string?)page!["result"]);} finally { await Do("close", new { sessionId = (string?)opened!["sessionId"] });}import com.fasterxml.jackson.databind.*;import java.net.URI;import java.net.http.*;import java.util.Map;public class AgentBrowse { static final URI API = URI.create("https://api.browser.city/v1/do/"); static final HttpClient HTTP = HttpClient.newHttpClient(); static final ObjectMapper JSON = new ObjectMapper(); public static void main(String[] args) throws Exception { var opened = callAction("open", Map.of("browser", "chromium")); var sessionId = opened.get("sessionId").asText(); try { callAction("navigate", Map.of("sessionId", sessionId, "url", "https://example.com")); var page = callAction("markdown", Map.of("sessionId", sessionId)); System.out.println(page.get("result").asText()); } finally { callAction("close", Map.of("sessionId", sessionId)); } } static JsonNode callAction(String action, Object body) throws Exception { var req = HttpRequest.newBuilder(API.resolve(action)) .header("Authorization", "Bearer %s".formatted(System.getenv("BROWSERCITY_API_KEY"))) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(JSON.writeValueAsString(body))).build(); return JSON.readTree(HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body()); }} Start for free. No credit card required. Private sessions by default.