Skip to main content

Kimi WebBridge

Control the user’s real browser (with their login sessions) via a local daemon at http://127.0.0.1:10086.

Health check (always do this first)

Then act on the result:
  • running: true and extension_connected: true — healthy. Proceed with the tool calls below.
  • Anything else (command not found, running: false, extension_connected: false, errors) — Read references/operations.md in this skill directory. It has the install / start / diagnose routing table.
Don’t guess fixes here — every non-healthy state is handled in references/operations.md.

Tools

Using find_tab

Use find_tab when the user explicitly asks to operate on an already-open tab. It matches by domain, so any URL on the same site works. Without active:true, returns the leftmost matching tab; with active:true, returns the tab the user is currently viewing — pass it when the user says “用我打开的 X” / “在我当前的 X 页面上”.
If find_tab returns “no open tab found”, the page is not open — fall back to navigate with newTab:true.

Call Format

Sessions

Each session maps to a separate browser tab group. Use different session names for different sites to keep operations isolated. Add "session":"name" to the request body:
Always assign distinct session names when working with multiple sites in parallel.

Screenshots: read the returned path

The daemon writes the image to disk and returns {format, path, sizeBytes, mimeType}. Read the .path and open it via the Read tool — the LLM cannot interpret raw base64 image data, so the file-path indirection is what makes the screenshot actually viewable.
path semantics mirror Playwright / Puppeteer — caller-supplied path is honored verbatim, parent directories are auto-created, existing files are overwritten. To avoid overwrite use a unique filename yourself. After parsing .data.path from the response, call the Read tool with that path to view the image.

Prefer snapshot over CSS/JS selectors

snapshot returns interactive elements with @e refs based on semantic role/name. Use them directly with click/fill — they survive CSS class hash changes that break manually-written selectors. Fall back to evaluate (JS) only when:
  • The target has no @e ref in the snapshot
  • You need attributes not in the snapshot (e.g., href)
  • You need to dispatch complex event sequences, or scroll

Evaluate Tips

  • Always use compact JSON.stringify(data) — never add null, 2 formatting. Indentation and newlines can inflate the response several times over, causing truncation during transmission.
  • evaluate calls share the page’s JS realm — re-declaring the same const/let across two calls throws SyntaxError. Wrap in an IIFE for a fresh scope: (() => { const x = ...; return x; })().

Text input — use fill

fill handles all three text input shapes. Pass selector (CSS or @e ref) + value: fill is clear-and-insert: existing content is replaced. For “append to existing text”, read the current value via evaluate, concatenate, then fill with the result.

Form submit / special keys

There’s no separate “press Enter” tool. To submit a form, click the submit button directly (click on the @e ref or selector). To dispatch a key event programmatically (e.g. Escape to close a modal):

Save the current page as PDF

save_as_pdf renders the current page to PDF, writes it to /tmp/kimi-webbridge-pdfs/, and returns the file path (the daemon strips the base64 — agent never sees raw PDF bytes). All args optional:
  • paper_format: letter (default) | a4 | legal | a3 | tabloid
  • landscape: false (default)
  • scale: 1.0 (default), range [0.1, 2.0]
  • print_background: true (default) — keep background colors
  • path: caller-supplied output path; if absent, daemon picks a default under OS temp dir using the page title as the filename
path semantics match screenshot: written verbatim, parent dirs auto-created, existing files overwritten. Decoded PDF cap is 100 MB. Above that the daemon refuses; reduce scale or split the page.

Known limitations

  • Sites that strictly check event.isTrusted (some banking portals, captcha challenges) reject fill and click because both go through DOM-level synthetic events (isTrusted=false). This is a product boundary, not a bug — no automation primitive that runs on the user’s machine without stealing OS focus can produce trusted events on these sites.
  • Cross-origin iframes: fill, click, evaluate, and snapshot operate on the top frame. If a target element lives in a same-page iframe from a different origin (e.g. embedded sandbox demos), navigate to the iframe’s URL directly instead.

Versions

Daemon, extension, and this skill share a 1:1 version string. Read both via:
If a tool returns an error containing “Please update the Kimi WebBridge extension”, the user’s extension is older than this skill. Tell the user:
请更新 Kimi WebBridge 浏览器扩展后重试:https://kimi.com/features/webbridge
Don’t retry the failed tool. Don’t auto-switch skill versions based on extension_version — the pairing protocol isn’t finalized.