Repository navigation
Conversation
… log Kernel MCP calls at the server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
xwebmcp-repl, a benchmark of how much a site's kernel/xwebmcp tools help an agent that drives a Kernel browser through Kernel MCP'sbrowser_repl. It serves two purposes:Pieces
Suite
xwebmcp-tasks. 56 tasks on 14 sites with xwebmcp tools that work signed out: airlines, Google Flights, AMC, Ticketmaster, Resy, Target, Etsy and Blue Bottle. Each site has four tasks: twotrain, onevalidation, onetest. Setup opens the task's start URL before the agent starts, so both arms start on the same loaded page.finalizetool. A small stdio MCP server,bench, with one tool:finalize(evidence, reasoning, outcome).outcomeissuccess,failed(the agent's own failure, or the site doesn't offer what the task asks),website_error(the site errored or blocked the agent: third party) orkernel_error(the browser, REPL or a WebMCP tool failed: first party).evidenceandreasoningcome beforeoutcomein the schema, and both must be non-empty. The first call wins; later calls are refused.rewardis 1 forsuccess.outcome_<name>andfinalizedrecord the rest. The report is kept asverifier/finalize.json, so an external judge can grade the same trials later.Arms. All use a stealth Kernel browser and have the agent's own web search/fetch tools off (
disable_web_search):codex-repl/codex-repl-xwebmcp: Codex 0.163.0,gpt-6-luna, withbrowser_replonly / plus the site's xwebmcp tools registered in the browser.claude-haiku-repl/claude-haiku-repl-xwebmcp: the same pair with Claude Code 2.1.301 andclaude-haiku-5-5.codex-playwright-mcp: Codex with Playwright MCP 0.0.83 connected over CDP to the same Kernel browser, to compare Playwright MCP's tools withbrowser_repl. Playwright MCP cannot call WebMCP tools, so it has no xwebmcp counterpart.The instruction is identical within each pair: list the page's tools with
webmcp.listTools()and use one when it fits. Only the page's tool list differs. The treatment arm gets the site's read-only tools, plus any state-changing tools a task names inactions(e.g.add_to_cart). Tools markedbrokenare skipped.Call logging. A stdio wrapper (
mcp-call-log) logs every tool call the browser MCP server receives, with timing. Validity checks, WebMCP-invocation counts and the report's call counts read it, so they work the same for every harness, including Codex 0.163.0, which nests MCP calls inside a code-modeexectool.Toolsets.
kernel-mcp-localtakestoolsets = ["repl"], which setsKERNEL_MCP_ENABLED_TOOLSETS, the instruction and the validity check. It now appends tomcp_serversinstead of replacing them. The default (playwright) produces the same instruction and image as before.xwebmcptoolset applieskernel-mcp-local, then copies the site's tool files and runsxwebmcp-registerin step setup.kernel-mcp-verifyalso addswebmcp_invoked(anywebmcp.invokeToolin a REPL cell), so adoption is visible in both arms.Harness.
[toolset_args]and benchmarks take[suite_args].--suite-arg KEY=VALUE,--toolset-arg KEY=VALUE(overrides only the arms that set that key) and--attempts(Harbor's--n-attempts).sys.modulesbefore they run, so dataclasses work in them.Report. When trials have no
reward_lenient, the report shows:finalizerate;ClawBench output is unchanged.
Workflow.
xwebmcp-repl.ymlwith inputs forsplit,attempts,xwebmcp_refandkernel_mcp_server_ref.First run
All 56 tasks, both arms, one attempt each, run locally on the benchmark project. Each site's four tasks mix three kinds: a search with several constraints (two dates, a time window, a fare type), a flow one step deeper (a round trip to the trip total, two items in a cart, a seat map), and a task that needs every result or a second page.
successboolean; later runs report the four outcomes above.frontier-las-den-eveningthe control arm found an evening nonstop and the treatment arm reported there was none.delta-evening-trip-summaryboth arms failed honestly: the qualifying fare was sold out in one arm, and Delta errored on the way to Trip Summary in the other.Test tasks replaced after the five-arm run
ticketmaster-msg-cheapest→ticketmaster-rangers-cheapest: every concert at Madison Square Garden in the next two months was one sold-out residency, so no arm could report a price. Rangers home games have resale and primary tickets for 2 (checked live).delta-evening-trip-summary(DTW→MSP) →delta-atl-lga-evening-summary: DTW→MSP has one nonstop after 5 PM, and its Main fare sold out. ATL→LGA has four, all with Main fares (checked live), and the task now says to skip sold-out fares.Caveats
finalize.json, would make success discriminate.--attempts 3or more and compare arms within one run.Testing
uv run pytest(21 tests): suite splits and fixtures,finalizeover stdio, scoring, both toolsets, and--toolset-argscoping.ruff checkandruff format.bun test,tscandprettierfor the new tables.bench preparefor both benchmarks, also added to CI.