Skip to Content
webagent docs
MCP

MCP server

The hosted webagent MCP endpoint. URL, transport, authentication and error statuses.

Open as .md

webagent runs a hosted MCP server. An MCP client such as Claude Code or Codex CLI connects to it and gets tools that open cloud browsers, run goals in them, scrape pages and run skills. You install nothing on your machine.

API address

The default API address is https://api.us.webagent.lookover.ai, so the MCP URL is https://api.us.webagent.lookover.ai/mcp. If your organization was given another API address, use that one. The shell example below uses the variable API_URL: set it with export API_URL=https://api.us.webagent.lookover.ai, and set WEBAGENT_API_KEY to your API key.

At a glance

URLhttps://api.us.webagent.lookover.ai/mcp (the API address, then /mcp)
TransportStreamable HTTP, POST only
StateStateless. No MCP session id, no server-sent stream
RepliesA single JSON body per request
AuthenticationAn API key, as Authorization: Bearer <key> or x-api-key: <key>
Server namewebagent
Server version0.1.0
Tools15 fixed tools, plus one skill_<name> tool per skill. See Tools

Connect a client

Create an API key in the dashboard, then add the server to your client. Each client has its own install line:

Any other client that supports Streamable HTTP and custom headers works the same way. Point it at https://api.us.webagent.lookover.ai/mcp and send the key in the Authorization header.

Transport

The endpoint accepts POST only. A GET or DELETE returns 405 with an Allow: POST header and the error code method_not_allowed. The server keeps no state between requests, so a client sends initialize, tools/list and tools/call as separate POST requests and needs no session header.

The request must send Content-Type: application/json and an Accept header that lists both application/json and text/event-stream. Without them the server answers 415 or 406. The server replies with plain JSON, never an event stream.

A raw call looks like this:

List the tools
curl -s $API_URL/mcp \
  -H "Authorization: Bearer $WEBAGENT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

The reply is one JSON body. Trimmed:

{
  "result": {
    "tools": [
      { "name": "create_session", "description": "...", "inputSchema": { "type": "object", "properties": { "...": "..." } } },
      { "name": "run_task", "description": "...", "inputSchema": { "...": "..." } }
    ]
  },
  "jsonrpc": "2.0",
  "id": 1
}

Authentication

Use an API key from the dashboard. Keys look like wa_us_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. The key decides the organization, the project and the role of every call, so tools run with the same limits as the REST API.

Send the key in one of two headers:

Authorization: Bearer wa_us_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x-api-key: wa_us_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

A key belongs to one region. The region is the part after wa_.

Errors

Problems with the connection itself are HTTP errors. The body is { "error": { "code", "message" } }, except for 406 and 415, which the MCP transport answers with a JSON-RPC error.

Statuserror.codeWhen
401unauthorizedNo key, or a key that is not valid
421wrong_regionThe key belongs to another region than this API. error.details.region names it
429rate_limitedMore than 600 requests in a minute for this key (the default). Retry-After says how many seconds to wait
405method_not_allowedGET or DELETE on /mcp
406noneThe Accept header does not list both application/json and text/event-stream
415noneThe Content-Type is not application/json

The rate limit counts every request to the API for the key, REST and MCP together. One MCP message is one request. The limit may change.

A tool that fails is not an HTTP error. The call returns normally, with isError: true and the error as text ([code] message) and in structuredContent.error. A test that ran and failed is not an error at all: isError is set only when a test could not run. See Tools.

Tools

Every tools/list call returns the 15 fixed tools, then one tool for each skill your project can see. A skill named smoke-uat appears as skill_smoke_uat. Dashes in the skill name become underscores. The list is built on each call, so a skill you add shows up on the next tools/list. Your client may need to reload its tool list to see it.

The server also sends a short instruction text on initialize. It names the tool families: browser sessions, quick actions (scrape, screenshot, pdf, crawl) and skill runs. It also tells the agent how to test a page: call smoke_test for a pass/fail verdict, then get_report while the verdict is running. It says that a failed test is a result and isError is set only when the test could not run, and that run_task is for an open-ended goal and checks no assertions.

To test a page or a flow, start with smoke_test. It makes one call, records the session and returns a report. get_report reads the report of a run or a task. run_task is for exploring.

Next: the tool reference, and how limits apply.

On this page