Skip to main content
Glama
Brad-Fullwood

bc-rig

bc-rig

bc-rig is a Linux-hosted Model Context Protocol server for driving two real Microsoft Dynamics 365 Business Central client surfaces:

  • Business Central web through Playwright and a persistent, human-authenticated Chromium session.

  • MobileNAV through an Android emulator, adb, and uiautomator.

It exposes both drivers through one stdio MCP server and can record exploratory runs, screenshots, and honest handover reports. The package does not contain credentials, customer data, MobileNAV, or an Android system image.

Install

Requirements:

  • Linux and Node.js 22 or newer.

  • Playwright Chromium: npx playwright install chromium.

  • For mobile tools: KVM access, Android command-line tools, and an x86_64 Android system image.

  • A valid Business Central account and MobileNAV licence/configuration for the environments you test.

Install the tagged GitHub release globally:

npm install --global github:Brad-Fullwood/bc-rig#v3.0.0
bc-rig init
bc-rig doctor

bc-rig init creates a commented config from .env.example. By default the config is ~/.config/bc-rig/.env; runtime data is kept under ~/.local/share/bc-rig. Both locations can be overridden—see Configuration.

To use the package without a global install, replace bc-rig with:

npx -y github:Brad-Fullwood/bc-rig#v3.0.0

Related MCP server: mcp-playwright-test

MCP configuration

The repository's .mcp.json is portable and contains no checkout-specific cwd:

{
  "mcpServers": {
    "bc-rig": {
      "command": "npx",
      "args": ["-y", "github:Brad-Fullwood/bc-rig#v3.0.0"]
    }
  }
}

The CLI starts the MCP server when no subcommand is given. A global installation can instead use "command": "bc-rig-mcp".

The old checkout-relative form—npx tsx src/mcp/server.ts plus an absolute cwd—is deliberately not used. Renaming or moving a source folder therefore cannot break the published MCP command.

First run

Every browser is initialized from the AL project's .vscode/launch.json; there is no global tenant, environment, profile, or CDP setting. From an MCP client, start a session with:

{
  "operation": "start",
  "launchJson": "/absolute/path/to/project/.vscode/launch.json",
  "configuration": "Microsoft cloud sandbox"
}

configuration is optional and selects the first AL launch entry when omitted. Comments and trailing commas are supported. Tenant and environment come from that entry; omitted fields use Business Central's normal cloud defaults. A headed window opens for interactive sign-in and MFA.

The equivalent operator CLI is:

bc-rig browser start --launch /absolute/path/to/project/.vscode/launch.json \
  --configuration "Microsoft cloud sandbox"
bc-rig browser list
bc-rig bc-check --session <session-id>

Every start creates a new random session ID, persistent profile, headed Chromium process, and OS-assigned CDP port. Two agents—even against the same launch configuration—therefore cannot share or redirect each other's tabs. Each MCP process binds its browser tools to the session it starts or explicitly selects.

For MobileNAV:

bc-rig avd setup
bc-rig avd start
bc-rig mobile-install
bc-rig mobile-connect /path/to/environment.mnlc

The APK is downloaded from the vendor at setup time and checksum-verified. It is not redistributed by this project. Microsoft/MobileNAV authentication may still require interactive user action.

Efficient agent workflow

The MCP surface is built around project session → observe → referenced action:

  1. Call browser_session with operation=start and the current project's launch.json.

  2. Call browser_observe or mobile_observe in compact mode.

  3. Act on the returned stable ref, such as @b7a12f or @m20c9e.

  4. Read the changed state returned by browser_act / mobile_act; do not immediately observe again.

  5. Use query to find page data that compact mode intentionally omitted.

  6. When polling, pass the previous rev as since; unchanged state costs one short line.

  7. Use full mode only for diagnosis. It is capped and explicitly marked as costly.

Refs are derived from role, accessible name, and occurrence in the existing ARIA/UI dump. Creating them requires no extra Playwright/ADB lookup calls. Browser actions accept an exact accessible name when a ref is unavailable, but the MCP surface does not expose raw CSS/Playwright selectors.

MCP tools

Tool

Purpose

doctor

Report host, Android, Playwright, and project-session readiness.

browser_session

Start/use/status/list/stop isolated browsers from AL launch configurations.

browser_observe

Return compact referenced state, focused query matches, or a capped full snapshot.

browser_act

Navigate/click/fill/press and return semantic changes or resulting compact state.

browser_screenshot

Save visual evidence only when text state is insufficient.

mobile_observe

Return compact referenced native state, optionally filtered or full.

mobile_act

Launch/stop/connect/tap/type/back/reset/wait and return resulting compact state.

mobile_screenshot

Save emulator visual evidence.

run

Start/status/annotate/finish an exploratory evidence manifest.

Connections are lazy: browser tools do not boot Android, and mobile tools do not require a browser. A mobile lease prevents two MCP processes from interleaving taps on the same emulator. Browser sessions are horizontally isolated and support concurrent agents.

Compared with v1, the advertised interface remains compact despite adding browser concurrency: 9 tools / 5,563 JSON bytes versus 18 tools / 7,663 bytes. Page responses shrink further because compact mode omits grid/text noise, actions return diffs, and unchanged polling returns only the revision marker.

Browser lifecycle change in v3

The singleton BC_BASE_URL, CDP_URL, and BC_PROFILE_DIR model was removed. Browser tools now reject calls until browser_session start or browser_session use binds that MCP process to an explicit project session. There is no implicit shared-browser fallback.

Reports

Start and finish a run through MCP, then generate its report:

bc-rig handover --run latest

Manifests and screenshots live in ~/.local/share/bc-rig/artifacts and generated reports in ~/.local/share/bc-rig/handover by default. The generator calls out read-only runs, missing client surfaces, absent failure probes, and missing screenshots instead of overstating coverage.

Configuration

Configuration precedence is:

  1. Existing process environment variables.

  2. BC_RIG_CONFIG_FILE.

  3. .env in the process launch directory.

  4. ~/.config/bc-rig/.env (or $XDG_CONFIG_HOME/bc-rig/.env).

Important overrides:

Variable

Default

BC_RIG_DATA_DIR

$XDG_DATA_HOME/bc-rig or ~/.local/share/bc-rig

BC_RIG_ARTIFACTS_DIR

<data>/artifacts

BC_RIG_HANDOVER_DIR

<data>/handover

ANDROID_HOME / ANDROID_SDK_ROOT

~/Android/Sdk

ANDROID_USER_HOME

~/.android

ANDROID_AVD_HOME

<ANDROID_USER_HOME>/avd

ANDROID_AVD_NAME

bcrig

Browser session records live under <data>/browser-sessions; isolated profiles live under <data>/browser-profiles/<session-id>. Chromium chooses each CDP port dynamically.

Run bc-rig paths to see the resolved locations.

Resource isolation

Browsers and emulators are the largest things bc-rig starts, and by default they would be charged to whichever cgroup started them. When an agent drives bc-rig from a terminal, that is the terminal's own cgroup: the browser's memory is accounted to the terminal, and anything that kills the browser can take the terminal and the agent session with it. On top of that, every process in a systemd user session inherits the same oom_score_adj (200), so under memory pressure the kernel scores a 136 MB terminal and a 339 MB browser tab within a few percent of each other.

bc-rig therefore starts each browser and emulator in its own transient systemd scope (bc-rig-browser-<session-id>.scope, bc-rig-emulator-<avd>.scope) and raises the process tree's oom_score_adj, so the kernel reclaims the browser rather than the terminal. Hosts without systemd fall back to spawning in the caller's cgroup.

Variable

Default

Effect

BC_RIG_SCOPE_CHILDREN

on

off spawns in the caller's cgroup instead of a scope

BC_RIG_OOM_SCORE_ADJ

900

oom_score_adj for the tree; off disables the hint

BC_RIG_BROWSER_MEMORY_HIGH

unset

MemoryHigh on the session's scope, e.g. 4G

BC_RIG_BROWSER_MEMORY_MAX

unset

MemoryMax; a breach OOM-kills inside the scope only

BC_RIG_MAX_BROWSER_SESSIONS

3

Concurrent live sessions; off removes the cap

Sessions are never implicitly reused and nothing reclaims one an agent forgot to stop, so BC_RIG_MAX_BROWSER_SESSIONS is what stops them accumulating. Inspect a running session's cgroup with systemctl --user status 'bc-rig-browser-*'.

Development

git clone https://github.com/Brad-Fullwood/bc-rig.git
cd bc-rig
npm ci
cp .env.example .env
npm run check
npm run mcp

npm run check compiles TypeScript, runs unit tests, performs a real MCP initialize/list-tools handshake, and inspects the publish tarball. See docs/architecture.md for the design and CONTRIBUTING.md for contribution guidance.

Security and privacy

Run artifacts can contain page text, company names, record data, screenshots, and target URLs. Connection files can identify tenants and users. They are excluded from git, but you are responsible for protecting the runtime data directory and reviewing every change before publishing. See SECURITY.md.

Licence

MIT. MobileNAV, Business Central, Android, Chromium, and Playwright retain their respective licences and trademarks.

Available Tools

9 tools
browser_actB

Act in the selected project browser. Use an @b ref from browser_observe; returns changed state.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoPlaywright key such as Enter or Escape
urlNo
valueNoText for fill; never echoed or stored
actionYes
targetNo@b ref preferred; otherwise exact accessible name
observeNochanges

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, so the tool modifies state but is not destructive. The description adds 'returns changed state,' which aligns with mutation. No further behavioral details are provided, but the annotations cover the safety profile adequately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short (one sentence), which is concise, but it lacks important details for an agent to fully understand usage. It is front-loaded with 'Act,' but the brevity reduces utility.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 parameters, 1 required, no output schema, and no nested objects, the description is insufficient. It does not explain the action enum, the observe options, or the url parameter. The tool's complexity demands more context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% for 6 parameters, but the description adds zero parameter-level details. The schema itself describes some parameters (e.g., key, value, target, observe), but the description does not compensate for the missing 50% coverage or provide additional meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool acts in the selected project browser and returns changed state, distinguishing it from browser_observe and browser_screenshot. However, 'act' alone is vague; the action enum is only in the schema. It clearly specifies the use of @b refs, which adds clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use an @b ref from browser_observe, providing a clear step to obtain the ref before acting. This guides the agent on workflow but does not explicitly state when to avoid the tool or list alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_observeA
Read-onlyIdempotent

Read the selected project browser. Call browser_session first. Compact returns stable @b refs; full is costly.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocompact
limitNo
queryNoRequired for query; filters compact controls too
sinceNoReturn only unchanged when revision matches
offsetNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly=true and idempotent=true. Description adds that compact returns stable @b refs and full is costly, plus the prerequisite of browser_session. Could mention error behavior if prerequisite not met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no superfluous text. Starts with purpose, then usage guidance. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with good annotations and no output schema, the description is nearly complete. Tells prerequisite, mode differences. Lacks explanation of 'selected project browser' and potential errors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40% (only query and since have descriptions). Description links compact mode to stable refs, but does not explain limit, offset, or query beyond schema. Some added value but insufficient to compensate for low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the selected project browser, distinguishing from action tools like browser_act and browser_screenshot. Mentions compact and full modes, with specific behavior for compact (stable @b refs).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Call browser_session first' as a prerequisite. Contrasts compact vs full ('Compact returns stable @b refs; full is costly'), guiding mode selection. Does not exclude alternatives like mobile_observe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_screenshotA

Save a BC screenshot and return its path. Use only when visual evidence matters.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so the description bears full burden for behavioral transparency. It states the tool saves a screenshot (implying a write operation) and returns a path, but it does not disclose potential side effects (e.g., file overwrite, permissions, storage location) or any constraints on usage. This lack of detail limits transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two sentences that are front-loaded with essential information. Every word serves a purpose, with no redundancy or filler. This is a model of efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema), the description provides adequate context: it describes the action and the return value. However, it does not explain what 'BC' stands for or the format of the returned path, which could be useful for an agent. For a low-complexity tool, this is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the description need not add parameter information. With 100% schema coverage, the baseline score is 3, but the description implicitly acknowledges the absence of parameters by not mentioning any, earning a 4 as no additional value is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Save a BC screenshot and return its path.' It specifies the verb (save) and the resource (screenshot), and adds a usage condition ('Use only when visual evidence matters') that further clarifies purpose. This distinguishes it from sibling tools like browser_observe and browser_act.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit guidance: 'Use only when visual evidence matters.' This tells the agent when the tool is appropriate. However, it does not name alternatives or provide explicit when-not-to-use scenarios, so it falls short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_sessionA
Destructive

Start, select, inspect, list, or stop isolated project browsers. Start requires an AL launch.json path.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id for use/status/stop; status defaults to this agent's active session
operationYes
launchJsonNoAbsolute path to the project's .vscode/launch.json
configurationNoAL configuration name; defaults to the first AL launch entry

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the description does not need to restate safety. It adds that start requires a specific path, but does not elaborate on effects like session isolation, what happens on stop, or output format, providing only minimal addition over annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the actions and includes a critical constraint. It is efficient with no wasted words, though it could benefit from a clearer separation of operations and outcomes without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has multiple operations and no output schema, the description is too brief. It does not explain what each operation returns (e.g., list yields session IDs, status gives session state), nor does it cover edge cases like what happens when no session is active. An agent would need additional inference for full understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 75% schema description coverage, the schema already documents most parameters. The description adds one behavioural note about launchJson being required for start, which is useful but not extensive. It does not clarify session or configuration semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description lists the core operations (start, select, inspect, list, stop) on 'isolated project browsers', clearly indicating the tool manages browser session lifecycles. It distinguishes well from siblings like browser_observe and browser_act, which handle interaction within sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions that 'Start requires an AL launch.json path', providing a specific prerequisite. However, it offers no guidance on when to use this tool versus alternatives (e.g., browser_observe for observing elements) or which operation to choose in different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doctorB
Read-onlyIdempotent

Check host, Android, Playwright, and project browser-session readiness.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true and idempotentHint=true, so the description adds no behavioral context beyond listing what is checked. It doesn't confirm the read-only nature or mention lack of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise (one sentence) and lists the components checked. It is appropriately sized but could benefit from a bit more structure (e.g., bullet points) for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description tells what it checks but not what the result looks like (e.g., boolean, summary). This leaves the agent guessing about the return format, which is a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. Baseline for 0 parameters is 4. Description adds no parameter info as none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks readiness of host, Android, Playwright, and project browser-session. It distinguishes itself from action-oriented sibling tools but could be more specific about what 'readiness' entails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings. As a diagnostic tool, it likely should be used before other actions, but the description does not indicate this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mobile_actA

Operate MobileNAV. Use @m refs for tap/type/wait. Returns compact state, avoiding a separate observe call.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo.mnlc path for connect
valueNoText for type; never echoed or stored
actionYes
targetNo@m ref preferred; exact id/text fallback
observeNocompact
snapshotNo
timeoutMsNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no safety hints (all false), and the description adds that value text is never echoed or stored, and returns compact state. However, it does not disclose potential destructive actions (e.g., reset) or side effects beyond the return.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the purpose and key usage, with no wasted words. Every line adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters, no output schema, and minimal annotations, the description covers core behavior but omits error handling, action details, and return format beyond 'compact state'. Additional completeness would help for such a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 43% schema coverage, the description adds meaning to target (@m refs) and observe (compact state), but fails to document snapshot or timeoutMs parameters. The schema enums for action and observe are clear, but no additional context is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool operates MobileNAV with actions like tap/type/wait, and distinguishes from mobile_observe by returning compact state. However, it doesn't explicitly list all actions or define 'MobileNAV', leaving some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using @m refs for target parameters and implies using this tool instead of mobile_observe for state, but lacks explicit when-to-use or when-not-to-use guidance compared to siblings like browser_act.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mobile_observeB
Read-onlyIdempotent

Read compact MobileNAV state with stable @m refs; full adds classes and bounds.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocompact
limitNo
queryNo
sinceNo
offsetNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral specifics beyond the annotations (e.g., stable @m refs in compact mode, classes and bounds in full mode). Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, which the description does not contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the purpose and key mode differentiation. Every word is meaningful, and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite good annotations, the description is too brief given the tool has 5 parameters and no output schema. It does not explain return structure, how parameters affect output, or how the two modes differ in results beyond a hint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate, but it only indirectly references the 'mode' parameter via 'compact' and 'full'. No mention of limit, query, since, or offset, leaving agents without parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads MobileNAV state (verb+resource) and distinguishes two modes: compact with stable @m refs, and full which adds classes and bounds. This differentiates it from sibling tools like browser_observe or mobile_act.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a read-only use case, aligning with its annotations, but provides no explicit guidance on when to use compact vs full, or when to choose this tool over browser_observe or other siblings. Usage context is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mobile_screenshotA

Save a MobileNAV screenshot and return its path. Use only for visual evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so the description must convey behavior. It mentions saving a screenshot and returning a path, which is clear. However, it does not detail file format, naming conventions, or side effects beyond saving.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no wasted words. Purpose and usage are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no params, no output schema), the description is largely complete. It could be slightly improved by clarifying what 'MobileNAV' is or the expected path format, but it is sufficient for basic selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and schema coverage is 100% trivial. The description adds no parameter details but this is acceptable; baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Save') and resource ('MobileNAV screenshot'), and specifies the return value ('path'). It distinguishes from sibling tools like browser_screenshot and mobile_observe by targeting MobileNAV.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Use only for visual evidence' implies a specific use case, but it does not explicitly state when not to use the tool or suggest alternatives from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

runC

Start, inspect, annotate, or finish the evidence manifest for an exploratory run.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNo
actionNo
driverNo
statusNo
targetNo
operationYes
observationNo

TDQS

C2.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, suggesting mutation but no destruction. The description does not add behavioral context such as required permissions, side effects, or rate limits. With sparse annotations, more transparency is needed. Score 2 for insufficient disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise, but it packs multiple actions without structure. It could be more effective with clearer separation and front-loaded key content. Score 3 for adequate but not optimal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, no output schema, and no explanation of the workflow or expected outcomes, the description is critically incomplete. It does not cover what happens upon 'start' vs 'status' vs 'finish', nor does it explain the evidence manifest concept. Score 1 for severe incompleteness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not clarify the meaning or usage of any of the 7 parameters, including 'action', 'label', 'status', etc. The tool's behavior depends on these parameters, but no semantic help is provided. Score 1 for failing to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description lists possible actions (start, inspect, annotate, finish) on an 'evidence manifest for an exploratory run,' but the term 'evidence manifest' is unclear. The purpose is somewhat vague and does not distinguish this tool from sibling tools that handle specific browser/mobile actions. Score 3 for vague purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus its siblings, which include browser and mobile observation/action tools. The description does not specify context, prerequisites, or exclusions. Score 2 for no usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv3.0.0
    • First observedbrowser_act
    • First observedbrowser_observe
    • First observedbrowser_screenshot
    • First observedbrowser_session
    • First observeddoctor
    • First observedmobile_act
    • First observedmobile_observe
    • First observedmobile_screenshot
    • First observedrun

TDQS

B3.3/5.0

Scored across 9 tools

Disambiguation5/5

Each tool has a clear, distinct purpose within its category (browser vs mobile vs utility). Browser tools cover session management, observation, action, and screenshot; mobile tools cover observation, action, and screenshot; doctor and run are unique utilities. No two tools appear to do the same thing.

Naming Consistency4/5

Most tools follow a consistent [category]_[action] pattern (browser_*, mobile_*), which is clear and predictable. The doctor and run tools deviate slightly as they lack a category prefix, but they are still verb-named and not ambiguous. Overall, naming is mostly consistent with minor deviations.

Tool Count5/5

With 9 tools, the server is well-scoped for its purpose: browser automation, mobile automation, and basic utilities. Each tool earns its place, and the number is neither too few nor too many for the apparent breadth of functionality.

Completeness3/5

The tool surface covers core browser and mobile interactions (observe, act, screenshot) and includes a readiness check (doctor) and manifest management (run). However, mobile session management is absent (no mobile_session tool), while browser has browser_session. This is a notable gap that could hinder mobile workflows.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A browser automation server providing Playwright capabilities for controlling web browsers, capturing screenshots, extracting content, and performing complex interactions through an MCP interface.
    6
    Apache 2.0
  • F
    license
    B
    quality
    B
    maintenance
    An MCP server for generic browser automation using Playwright. Enables MCP clients to navigate pages, inspect elements, execute JavaScript, capture screenshots, and monitor console logs and network traffic via a headless Chromium instance.
    7
    -