MCP HTTP and stdio
MCP exposes scoped native API tools and page tools from the local application. Discover the actual names and schemas through tools/list.
HTTP transport
Use the displayed native base address plus /mcp. Send Authorization: Bearer and Content-Type: application/json. Advertise Accept: application/json, text/event-stream. Initialize with your supported protocol version, clientInfo and capabilities; follow with notifications/initialized. After negotiation send MCP-Protocol-Version with subsequent HTTP requests.
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {},
"clientInfo": {
"name": "example-local-client",
"version": "1.0"
}
}
}{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_profiles","arguments":{"limit":1}}}Supported protocol versions in this implementation are 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05. Inspect the server’s initialize result; do not assume your requested version was selected. Use single messages rather than HTTP batches for current clients.
Node.js stdio bridge
node tabgecko.mjs mcpDownload tabgecko.mjs, configure your MCP client to execute Node.js with the absolute path to that file and argument mcp. Supply ADBR_API_TOKEN and optionally ADBR_API_URL in the child process environment. Do not paste a shell command into a JSON args entry. Standard output is reserved for newline-delimited JSON-RPC.
{
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_tabgecko.mjs>",
"mcp"
],
"env": {
"ADBR_API_URL": "http://127.0.0.1:47300",
"ADBR_API_TOKEN": "<LOCAL_MCP_TOKEN>"
}
}Client configuration formats differ. Map this process definition to your client’s documented MCP configuration. The CLI does not start the desktop or install a kernel. An explicit URL selects the intended instance; otherwise local runtime metadata is used.
API tools and page tools
Generated API tools use a method prefix, such as get_profiles and post_profiles_id_start. Path/query arguments are direct properties; a JSON request body is nested under body. tools/list only includes tools allowed by the token. Do not infer permissions from a tool name or readOnlyHint alone.
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "post_profiles_id_start",
"arguments": {
"id": "PROFILE_ID",
"body": {}
}
}
}page_list, page_open, page_navigate, page_text, page_html, page_screenshot, page_click, page_type, page_press_key and page_evaluate act on a running profile. Resolve profile_id (or supported profile_no) and target_id explicitly. Read the returned schema before each new tool family; page_evaluate executes code in the page and is not a read-only promise.
Find tools and built-in help
Use list_mcp_tools to search tool names and descriptions, optionally filter read_only and paginate with offset/limit. describe_mcp_tool returns the complete input schema and token scopes for a permitted tool. get_mcp_guide lists topics or returns a topic in English or German. These tools are available from version 0.5.12; discover the running server’s capabilities first.
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "list_mcp_tools",
"arguments": {
"query": "automation",
"limit": 10
}
}
}{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "get_mcp_guide",
"arguments": {
"topic": "editing",
"language": "en"
}
}
}Check without executing
post_automation_workflows_validate accepts body.workflow and optionally body.id for an existing workflow. It checks schema, JavaScript syntax, profile references, subworkflow cycles/depth and schedules without saving, opening browsers or executing code. Read warnings even when valid is true. This is not a simulation of remote pages, selectors, credentials or execution permissions. post_automation_test_run actually executes actions.
Atomic changes and revision conflicts
Read get_automation_workflows_id for workflow and revision. Send that revision as expected_revision to patch_automation_workflows_id_steps. Edits use zero-based indices relative to the result of the previous edit. delete_count: 0 inserts; steps: [] removes. The complete batch is validated and committed atomically. Limits: 100 edits, 200 steps per intermediate/final state, at least one final step. On HTTP 409 automation.revision_conflict, reload and reconcile instead of blindly retrying. Existing running jobs keep their initial workflow snapshot. Reading and editing stored workflow values additionally requires secrets:read.
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "patch_automation_workflows_id_steps",
"arguments": {
"id": "WORKFLOW_ID",
"body": {
"expected_revision": "REVISION_FROM_GET",
"edits": [
{
"index": 0,
"delete_count": 1,
"steps": [
{
"action": "wait",
"value": "100"
}
]
}
]
}
}
}
}Incremental execution logs
get_automation_runs_id returns status and bounded event pages. Start with since: 0 and limit: 100, then use log.next as since. Drain log.has_more even after completion. Wait between polls while a run is active. Sequence numbers are stable and increasing; events contain state and diagnostics, not input values or variable contents. Only the last 1000 events are retained. log.truncated and first_available identify a gap; log.available is false for old runs without logs. Removed history returns 404. A cancellation request is asynchronous: continue observing until the final state. Abrupt shutdown may lose events not yet persisted.
{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "get_automation_runs_id",
"arguments": {
"id": "RUN_ID",
"since": 0,
"limit": 100
}
}
}Errors and lifecycle limits
The downloadable stdio bridge accepts one message per line, up to 1 MiB, and limits responses to 20 MiB. It allows eight concurrent requests with a 30-second request deadline. EOF and blocked output have bounded shutdown handling. Initialize finishes before subsequent messages are forwarded; the negotiated version header is added automatically.
This local server uses stateless JSON HTTP responses. It has no SSE subscription, resumable session or server-push channel; GET and DELETE /mcp return 405. Notifications have no JSON-RPC response and are acknowledged with HTTP 202. Inspect both JSON-RPC error and tool result.isError even when HTTP is 200. A transport disconnect does not roll back a started tool, and cancellation is not an undo operation. Re-read state after uncertain mutations instead of blindly retrying.