Skip to content
Back to skills

Agentgo

ASecurity

Drive the AgentGo browser (a real Chromium on Windows built for agents). Use for any task on the web: reading pages, clicking, typing, forms, search, downloads, signed-in accounts and their APIs. Read this before the first browser call.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 22, 2026
ai-agentsgoshellgitapi

Works with

  • claude code
  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned October 22, 2026

npx -y skills add Moha2005269/agentgo --skill agentgo --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Agentgo?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Agentgo
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/moha2005269-agentgo/badge)](https://www.skillsdirectory.com/skills/moha2005269-agentgo)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: agentgo
description: "Drive the AgentGo browser (a real Chromium on Windows built for agents). Use for any task on the web: reading pages, clicking, typing, forms, search, downloads, signed-in accounts and their APIs. Read this before the first browser call."
---

# AgentGo

AgentGo is a real browser that you operate through commands. You are the
planner; AgentGo does the browser work: it reads pages into a few lines, runs
your actions with its own pointer and keyboard, waits until the page is quiet,
and tells you only what changed. It makes no model calls.

Three files:

- this one: how to work;
- `references/commands.md`: every command with what it does (generated from
  the browser's registry, so it is never out of date);
- `references/gomini.md`: GoMini, the local model that takes routine steps.

Over MCP the same text is served by `browser_guide` (`topic`: `start`,
`commands`, `gomini`). The command list is long (about 25,000 tokens): find
what you need with `browser_guide {topic: "commands", query: "<words>"}`, or
read one section with `group`.

## Connect

| You are | Do this |
|---|---|
| An MCP host (Claude Code, Codex, ...) | `claude mcp add --scope user agentgo -- agentgo mcp`. Use the `browser_*` tools; `browser_call` reaches every command by name. |
| Anything that runs a shell | `agentgo call <method> '<json params>'` talks to the running browser. |
| A program | Start `agentgo run --stdio` and exchange one JSON object per line: `{"v":1,"id":1,"method":"observe.page","params":{}}` and `{"v":1,"id":1,"ok":true,"result":{...}}`. |

**Say when you start and when you are done.** With `agentgo call`, begin with
`agentgo call agent.connect '{"name":"<your name>"}'` and end with
`agentgo call agent.disconnect '{"name":"<your name>"}'`: the toolbar shows the
person that an agent is working for exactly that time (an MCP or stdio
connection does this for you while it is open). While you act, the page does
not take the person's clicks and keys; the toolbar, Settings, Pause and Stop
stay theirs.

The browser you start opens **behind** the person's windows and never takes
their mouse, keyboard or focus. They can open it from the taskbar to watch you:
your pointer, your typing and your navigation are drawn on the page.

## The loop

1. **Open**: `navigate.url {url}` (or `{query}` to search). It answers once the
   page is usable (`usable: true` while trackers and media still load; pass
   `wait: "load"` to wait for everything). The reply
   already contains the page outline.
2. **Read** the outline. Each line is something on the page; lines that begin
   with `[n]` can be acted on by that number:

   ```text
   # Sign in
   [1] textbox(email) "Email"
   [2] textbox(password) "Password"
   [3] button "Sign in"
   ```

3. **Act** by reference: `act.fill {ref:1, text:"..."}`, `act.click {ref:3}`.
   The reply is a **change set**, not the page again: `+` added, `~` changed,
   `-` removed lines, plus `navigated`, `url`, `title` when they changed.
4. Repeat from the change set. Call `observe.page` again only when you need
   the whole outline (after a big change, or when a reference went stale).

Rules that save you turns:

- Use references, not coordinates. Coordinates (`x`, `y`) are the fallback for
  canvases and maps.
- A reference stays valid while its element exists, also across re-renders.
  `target.stale`: observe again. `target.ambiguous`: the reply lists the
  matches. `target.blocked`: something covers the element or a dialog is open
  (`dialog.accept` / `dialog.dismiss`).
- Several steps you are sure of go in one `workflow.batch {steps:[...]}`: it
  stops at the first failure and returns each step's change set.
- Reading: `observe.text` for prose (paged with `offset`), `observe.links`,
  `observe.tables`, `observe.forms`, `page.find {text}`. Screenshots
  (`observe.screenshot`) cost far more than an outline; use them for visual
  questions only.
- Waiting is built into every action. Use `wait.text`, `wait.selector` or
  `wait.condition` only for things that happen later on their own.
- `form.fill {fields:{"Email":"...", ...}}` fills a whole form in one call;
  `workflow.search_extract {query}` returns search results as records;
  `workflow.collect` scrolls and gathers a long list.

## What the browser decides, not you

- **Approvals.** In approval mode a final form submission, and in every mode
  a purchase or payment, answers `approval.required` with an `approvalId`.
  Call `approval.wait {approvalId}`; when the person grants it, repeat the
  action with `approvalId`. Do not look for another way to submit.
- **CAPTCHA and human checks.** You get `handoff.required`. Call
  `handoff.wait`; the person is notified and solves it in the same tab. Never
  try to solve or avoid one.
- **Dangerous sites.** A known malware or phishing site, or an address that
  imitates a well-known one, is stopped before it loads: the reply's load
  error starts with `AGENTGO_DANGEROUS_` or `AGENTGO_DECEPTIVE_SITE` and the
  tab shows a warning. Do not try another address for the same site and do
  not click the warning; tell the person what you were trying to open.
- **Pause and Stop.** The person can pause or stop you at any time; you then
  get `unauthorized` until they resume.
- **Accounts.** You may use the accounts the person is signed in to, unless
  they blocked one in the Account Center (`policy.denied` with
  `blocked: true`). Then ask them; do not work around it.

## Accounts, sign-ins and APIs

- `accounts.list`: the accounts, whether each is blocked, and its API state.
- Signing in: if a login form is in front of you, call `credentials.fill`.
  The browser types the saved sign-in for that exact site; you never see the
  password. `credentials.list` shows where that works. If nothing is saved,
  ask the person, or type credentials they gave you; the browser then offers
  the person to save them.
- APIs: `connectors.list` shows the APIs you can call as the person (Google
  Drive, Gmail, Photos, Calendar, GitHub, Yandex Disk, or one they added).
  `connectors.call {account, connector, method, path, body}` sends one
  request; the browser adds the token. Prefer an API to clicking through the
  site when one exists: it is faster and returns data, not pages.

## Tabs and the person

- You work in your own tabs: `tabs.create`, `tabs.list` (yours only),
  `tabs.close`. Without `tabId` a command goes to the tab you used last.
- A tab you open may stay in the background (`active: false`). It still loads,
  renders and takes your input; `tabs.activate` may answer `applied: false`
  when the person is using the window. That is not an error.
- `clipboard.copy`, `clipboard.paste` and `clipboard.write` use a clipboard of
  your own. The person's Windows clipboard is never touched.

## Errors

Every failure has a code. The ones you act on:

| Code | Meaning | Do |
|---|---|---|
| `target.stale` | the reference is gone or the page changed | `observe.page`, pick again |
| `target.ambiguous` | several elements match | choose one of the listed references |
| `target.blocked` | covered, disabled, or a dialog is open | handle the dialog or overlay |
| `approval.required` | the person must agree | `approval.wait`, then repeat with `approvalId` |
| `handoff.required` | a human check | `handoff.wait` |
| `policy.denied` | not allowed for agents | tell the person; do not retry differently |
| `unauthorized` | paused, stopped, or not your tab | wait or ask |
| `timeout` | the page did not get there | observe, then decide |
| `capability.unsupported` | the browser cannot do this | the message says why; use another route |

## GoMini (optional local model)

When the person has GoMini on (`decision.status` says `active: true`; over
MCP you also get `browser_delegate`), hand routine steps to it instead of
reading and acting yourself: `gomini.delegate {subgoal, values, completion,
constraints}` fills the values you supply, clicks, checks, selects, scrolls
and waits on this computer, then returns `done`, `needs_help` or `stopped`
with every step and evidence. One delegation replaces a run of read and act
turns. Payments, sign-ins, final submissions and deletes always come back to
you. When it is off, `gomini.delegate` answers `capability.unsupported`:
work as usual. How to phrase a subgoal and what comes back:
`references/gomini.md`.

## Versions and sources

Skill version 0.1.0, protocol 0.1.0 (`agentgo version --json` reports both).
A plain search query opens `https://www.google.com/search?q=<query>`; there is
no other search product. Every register name, with its status, is in
`schemas/capability-manifest.json`; do not call names that are not there.

Files in this skill

  • LICENSE1.1 KB
  • SKILL.md8.5 KB
  • references/commands.md90.3 KB
  • references/gomini.md6.4 KB
  • references/mcp.md3.1 KB
  • references/shell-bridge.md942 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.