Documentation / MCP HTTP and stdio

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.

JSON
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-11-25",
    "capabilities": {},
    "clientInfo": {
      "name": "example-local-client",
      "version": "1.0"
    }
  }
}
Three separate HTTP requests, or three stdio lines
{"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.js 22+
node tabgecko.mjs mcp

Download 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.

Process configuration fragment, client-specific wrapper omitted
{
  "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.

JSON
{
  "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.

JSON
{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "list_mcp_tools",
    "arguments": {
      "query": "automation",
      "limit": 10
    }
  }
}
JSON
{
  "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.

JSON
{
  "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.

JSON
{
  "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.