Skip to main content
Glama

shinyprobe

An MCP server that gives coding agents hands and eyes on a running Shiny app, R or Python.

Why

Coding agents write Shiny code blind. Once the app runs, they cannot set an input, see the plot, or tell which output broke and why. shinyprobe gives them a real browser on the running app, and it understands Shiny rather than just the page.

It knows when Shiny has finished. Every action waits for the app to settle, then reports which outputs changed and what went wrong. No sleeping, polling or guessing from screenshots. A generic browser tool cannot tell "still computing" from "nothing happened"; shinyprobe can, including on slow hosted apps.

Errors come with an address. A failing output returns the R or Python traceback, with file and line (app.R#14), attached to the output it broke. validate() is a warning, req() is silent, and only real errors are errors. A crash says so, with the exit code and the last console lines.

It catches mistakes you would not see. It warns when a widget rejects a value (a select given a choice it doesn't have) and when an output never renders, usually a typo'd id. Both otherwise look fine and are quietly wrong.

It handles real app structure. Tabs, accordions, sidebars, renderUI and modules all work. Clicking something on another tab opens that tab first, as a user would. If a conditionalPanel hides it, the error names the condition to meet.

It shortens the fix-and-check loop. get_console shows what the app printed. launch_app(replay=True) restarts the app after a code change and replays the same inputs and clicks, so "fix it, then get back to where it broke" is one call.

It returns data, not just pictures. Tables come back as columns and rows, plots with their axis ranges and mapped variables, htmlwidgets with their data payload.

It stays out of your app. No R packages to install, no changes to your code. It works on local apps and on public deployments.

The difference: an agent can check its work instead of assuming it. "I've written the change" becomes "I've written the change, set n to 5, the table has five rows, and nothing errored".

Related MCP server: AI Web Tester

Quickstart

uvx shinyprobe install-browser
claude mcp add shinyprobe -- uvx shinyprobe

Then ask your agent to launch your app, change inputs and read outputs.

You need R with shiny for R apps, or a Python with shiny for Python apps. shinyprobe finds Rscript and python on your PATH (and R's default install folder on Windows); set SHINYPROBE_RSCRIPT or SHINYPROBE_PYTHON to use others. Set SHINYPROBE_HEADED=1 to watch the browser.

Tools

Tool

What it does

launch_app

Start the app in a folder or file and open it. Relaunching the same path keeps the app_id; replay=True reruns the previous run's actions.

attach

Open an app that is already running, locally or deployed.

stop_app

Close the page and stop a launched app.

list_controls

Every input (id, type, label, value, choices) and output (id, type, status), with visibility.

set_inputs

Set inputs through their widgets and wait for the app to settle.

click

Click a button, opening any tab or panel around it first.

show

Open the tab, accordion panel, sidebar or <details> holding an element, by id or label.

upload_file

Upload a local file into a file input.

read_outputs

Text, tables as rows, plots and widgets as images plus their data.

get_errors

Every error so far: server traces, output errors, browser errors, crashes.

get_console

The app's own console output, for launched apps.

screenshot

The whole page or one element.

Every action returns the same envelope: status (settled, no_change, timeout or disconnected), changed_outputs, errors and warnings.

Hosted apps

attach works on public deployments such as shinyapps.io. You lose what lives in the host's process: no server tracebacks, no console, and hosts usually hide error messages ("An error has occurred…"), though you still learn which output failed. Each attach is a real session on that server and counts towards its usage. Apps behind a login are not supported yet.

Available Tools

12 tools
attachB

Open an app that is already running (local or deployed) at url and wait for it to settle.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses one behavioral trait—'wait for it to settle'—but that phrase is vague and does not explain what settling means, how long the wait is, whether the operation blocks, or what side effects attaching may have. This is insufficient behavioral transparency for a tool with zero annotation support.

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 a single compact sentence that front-loads the action and resource, then adds the waiting behavior. Every phrase earns its place, and there is no redundant or filler content.

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?

Although the tool is simple with one parameter and no output schema, the description leaves key operational details unexplained: what 'settle' means, timeout expectations, failure behavior, and whether attaching affects the app's state. With no annotations and no output schema, the description alone is not complete enough for an agent to call this tool confidently in varied scenarios.

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?

The input schema only defines url as a required string with no description. The tool description adds useful meaning by indicating the url refers to an already-running local or deployed app. However, it does not specify URL format, protocol, or how the url is used, so it only partially compensates for the 0% schema description 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 uses a specific verb ('Open'), identifies the resource ('an app that is already running'), and scopes it by location ('at `url`'). It also distinguishes itself from sibling launch_app by explicitly stating the app is already running, so an agent can tell attach from a launch operation.

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 when to use the tool: when an app is already running and needs to be opened/attached to. However, it never names the alternative launch_app or explicitly says 'use launch_app if the app is not running,' leaving the routing decision to inference rather than direct guidance.

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

clickA

Click the element with this id (usually an action button), then wait for the app to settle. If it is on another tab or in a closed panel, those are opened first, as a user would.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
app_idYes
timeout_sNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does well by disclosing that it waits for the app to settle and that hidden tabs/closed panels are opened first. This goes beyond a bare 'click' statement. It still does not describe failure or timeout behavior, but the core interaction traits are clearly surfaced.

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 tightly written sentences with no filler. The core action is front-loaded, and the secondary behavior about tabs/panels is added only after the primary action, making the structure easy to parse.

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 simple click interaction, the description covers the operation, post-click waiting, and automatic navigation to hidden targets. It falls slightly short only in not defining the role of app_id or what happens on timeout/failure, but the description is largely sufficient for invoking the tool correctly.

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 0%, so the description must compensate, but it only clarifies 'id' as the element id. 'app_id' is never mentioned, and 'timeout_s' is only indirectly tied to 'wait for the app to settle'. Self-explanatory titles help, but the description does not carry enough parameter meaning.

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 states a specific verb and resource: 'Click the element with this id (usually an action button)'. It also clarifies the intended target class and the post-click behavior, making it clearly distinct from sibling tools like list_controls, set_inputs, or read_outputs.

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 when to use the tool: to click an action button by id, and it usefully notes that tabs/panels are opened automatically. However, it does not explicitly state when not to use it or name alternatives, leaving the agent to infer the selection 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.

get_consoleA

The app's console output (print, message, cat, logging), newest last: the last lines lines, or with since_last=True everything since the previous since_last call. Long output keeps the newest lines and says how many older ones were cut. Only for apps started with launch_app.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNo
app_idYes
since_lastNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses newest-last ordering, the since_last incremental behavior, truncation of long output with a count of dropped lines, and the launch_app precondition. This is a meaningful behavioral profile beyond the bare schema.

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 compact and front-loaded, with the core purpose stated first and all behavioral constraints expressed in three tight sentences. Every clause adds information; there is no filler or repetition of schema defaults.

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 medium-complexity tool with three parameters)Skip no output schema and no annotations, the description covers the essential behavioral and parameter-level details. Minor gaps remain around exact return formatting and error behavior for non-launch_app apps, but nothing critical prevents correct invocation.

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?

Schema description coverage is 0%, so the description must compensate, and it does: lines is explained as how many trailing lines to return, since_last=True is explained as returning everything since the previous such call, and app_id is tied to apps started via launch_app. Exact parameter value formats are not specified, but the core semantics are clear.

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 identifies the tool as retrieving an app's console output, naming source types (print, message, cat, logging) and ordering (newest last). It does not explicitly distinguish itself from sibling tools like read_outputs or get_errors, so it falls short of full sibling differentiation.

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 states when the tool applies ('Only for apps started with launch_app') and explains the two retrieval modes (last N lines vs since_last). It does not explicitly guide the agent toward this tool over read_outputs or get_errors, leaving the choice to inference from 'console output.'

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

get_errorsA

Every error seen so far: server errors with traces (and the output they broke), Shiny output errors, browser console errors, and the app exiting. With since_last=True, only errors since the previous since_last call.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
since_lastNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden well. It reveals that errors accumulate, that server errors include traces and the output they broke, and that since_last defines a query window relative to the previous since_last call. It does not mention response format or side effects, but nothing contradicts the tool behavior.

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 dense sentences with no filler. The first sentence front-loads the tool's scope with specific error categories, and the second handles the main parameter behavior. Every sentence earns its place.

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 two-parameter read tool with no output schema, the description sufficiently explains what the agent will receive and how since_last changes the result. It could be more explicit about return shape or that app_id scopes the errors, but the core contract is clear.

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?

Schema description coverage is 0%, but the description adds meaningful semantics for since_last: 'only errors since the previous since_last call.' app_id is not elaborated, though its role is reasonably clear from the parameter name and app-centric sibling tools.

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 identifies the resource (errors) and enumerates concrete error categories: server errors with traces, Shiny output errors, browser console errors, and app exits. This clearly distinguishes get_errors from siblings like get_console and read_outputs.

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?

It provides clear context: this is the comprehensive error-listing tool, and explains when to use since_last=True. It does not explicitly name alternatives or state when not to use it, so it stops short of a 5.

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

launch_appA

Start the Shiny app at path and open it in a browser, then wait for the first load to settle.

path is a folder with app.R, ui.R + server.R, or app.py, or the app.R / app.py file itself. interpreter overrides the Rscript or Python executable. Launching the same path again stops the old copy and relaunches it under the same app_id (use this after a crash or a code change). With replay=True, the set_inputs, click, upload_file and show actions from the previous run of this path are run again in order, to get back to the same state; replay says how many ran and which one failed, if any, and the envelope covers the load and every replayed action.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
replayNo
interpreterNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It reveals that relaunching stops the old copy, waits for the first load, and describes the replay action envelope. It does not cover failure modes or permissions, but it does disclose key side effects and timing behavior beyond the basic 'start' action, which is more than typical.

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 well-organized, starting with the core purpose in the first sentence, then dedicating a paragraph to each parameter. It is fairly concise for the amount of information conveyed, though it could be slightly trimmed without losing value. The structure aids comprehension, and the content justifies its length.

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 tool with three parameters, no annotations, and no output schema, the description covers the launch process, parameter semantics, and replay behavior. It hints at the return envelope but does not detail the exact output format or error handling. Given the complexity, it provides nearly all necessary context for an agent to invoke it correctly, though minor gaps (e.g., prerequisites like R/Python) remain.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: `path` is defined as a folder (app.R, ui.R + server.R, app.py) or file; `interpreter` overrides the Rscript or Python executable; `replay` explains the replayed actions and the envelope. Each parameter's meaning and usage is clearly articulated, fully compensating for the schema gap.

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 states a specific verb and resource: 'Start the Shiny app at `path` and open it in a browser, then wait for the first load to settle.' It clearly distinguishes itself from siblings like stop_app and attach by describing the launch behavior. The purpose is unambiguous and specific.

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 provides clear context for when to use it, such as explaining that relaunching the same path stops the old copy (use after a crash or code change). It does not explicitly name alternatives or exclusions, but the guidance on relaunching and replay gives practical usage direction. A score of 4 reflects clear context without explicit when-not-to-use.

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

list_controlsA

List every input (id, type, label, current value, choices, visible) and output (id, type, status, visible). Call again after dynamic UI changes: the page is re-scanned every time.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It reveals that 'the page is re-scanned every time,' indicating the tool returns a fresh snapshot and that repeated calls reflect dynamic UI changes. It does not mention side effects or permissions, but the listed fields and re-scan behavior give useful transparency for a list operation.

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 tightly written sentences with no filler. The core purpose is front-loaded, the field list is compact, and the re-scan behavior is delivered in a second short sentence.

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?

The description enumerates the fields returned for inputs and outputs, which partially substitutes for the missing output schema, and it gives the key re-scan behavior. The only notable gap is the unexplained required app_id parameter, which prevents full completeness.

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?

The schema has 0% description coverage and the description never mentions app_id at all. The only meaning comes from the parameter title 'App Id', which is minimal. The description should compensate for the missing schema detail, but it does not explain where the app_id comes from or how to obtain it.

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 names a specific verb ('List') and resource ('every input ... and output ...'), enumerating the exact fields returned for both. This clearly distinguishes list_controls from siblings like read_outputs and click, which target different aspects of the UI.

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?

It provides explicit timing guidance: 'Call again after dynamic UI changes.' This tells the agent when to re-invoke the tool. However, it does not explicitly contrast it with sibling tools or state when not to use it, so it falls short of a full 5.

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

read_outputsA

Read outputs (all of them when ids is empty). Text and HTML come back as text, tables as columns plus data rows (first 50, with the total), plots, images and htmlwidgets as images after the JSON summary. Plots also give each panel's axis ranges (and the mapped variables for ggplot2) in data; htmlwidgets give the data payload they were sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo
app_idYes

TDQS

A3.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so impressively: it discloses exact return representations for text, HTML, tables (first 50 rows with total), plots, images, and htmlwidgets, plus extra data such as axis ranges and ggplot2 mappings. This goes well beyond a generic 'read outputs' statement.

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 dense but well organized: it starts with the core behavior, then maps output types to return formats, then covers special metadata. Every clause adds information, though the single long sentence could be slightly easier to parse if split into structured points.

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 mixed output types and the absence of an output schema, the description does a good job explaining what callers will receive. It lacks details about app_id semantics, ids value format, ordering, or the exact contents of the 'JSON summary', but the essential behavior is clear enough for an agent to invoke it correctly.

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 0%, so the description must compensate for the schema's silence. It clarifies that an empty ids list means all outputs, which adds real meaning. However, it does not explain the app_id parameter or how ids values are structured beyond the schema's array-of-strings definition.

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's verb and resource: 'Read outputs' with an explicit scope note ('all of them when ids is empty'). It does not explicitly name sibling alternatives, but the output-focused behavior is distinct from sibling tools like get_errors, get_console, and screenshot.

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 when-to-use guidance is provided, and there are no explicit exclusions or comparisons to alternatives such as get_errors, get_console, or show. The intended usage is implied by the tool name and description, but the agent is not told when this tool is the right choice versus its siblings.

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

screenshotA

Take a PNG screenshot of the whole page, or of one element when id is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
app_idYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses the output format (PNG) and the effect of the `id` parameter, but does not mention side effects, required app state, error behavior, or whether the screenshot is returned inline, saved, or accessible via a path.

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, front-loaded sentence that conveys both the main operation and the optional mode with zero wasted words. The conditional clause about `id` is placed efficiently and reads clearly.

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?

For a simple capture tool, the description covers the essential behavior and the optional element targeting. However, with no output schema and no annotations, it could usefully mention what the returned PNG is (path, data, etc.) and how `app_id` relates to the running app.

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 0%, so the description must compensate. It explains the meaning of `id` (selects an element) but gives no meaning for the required `app_id`, leaving a key parameter undocumented.

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 uses a specific verb ('Take') and resource ('PNG screenshot'), and clearly distinguishes between whole-page and element-level capture via the `id` parameter. This separates it from sibling tools like `click` or `list_controls`.

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 usage: call it when you need a visual snapshot of the page or a specific element. However, it does not explicitly state when to prefer this over alternatives such as `read_outputs` or `show`, nor does it mention any prerequisites like an active app.

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

set_inputsA

Set one or more inputs, e.g. {"n": 5, "species": ["setosa"]}, through their widgets, then wait for the app to settle. Warns if an input ends up with a different value than asked for. Use click for buttons and upload_file for file inputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
valuesYes
timeout_sNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It explains that the tool waits for the app to settle and warns if an input ends up with a different value than requested, which are non-obvious behaviors. It does not mention timeout behavior or preconditions like the app needing to be running, but the included details add meaningful context.

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 concise and well-structured: it opens with the core purpose, gives an example, notes a useful behavioral warning, and closes with explicit sibling routing. Every sentence earns its place without unnecessary detail.

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 absence of annotations and output schema, the description covers the essential aspects: what it does, how values look, what happens afterward, and which sibling tools handle other cases. It lacks explicit timeout semantics and return value details, but is still sufficiently complete for an agent to select and invoke the tool correctly.

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 description coverage is 0%, so the description must compensate. It does add meaning for the 'values' parameter through a concrete example and by saying inputs are set 'through their widgets'. However, it does not explain 'app_id' or 'timeout_s' beyond their names, leaving some parameter semantics to inference.

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 uses a specific verb and resource: 'Set one or more inputs ... through their widgets'. It also explicitly distinguishes itself from sibling tools by stating 'Use click for buttons and upload_file for file inputs', so an agent can immediately tell what this tool is for.

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 provides clear routing to alternatives for buttons and file inputs, which is strong usage guidance. It implies the tool is for input widgets other than buttons and file inputs, but does not explicitly spell out all when-to-use/when-not-to-use scenarios.

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

showA

Bring an element into view: target is an element id, or a tab, accordion panel or

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
targetYes
timeout_sNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure, and it does well: it says it opens tabs, panels, sidebars, and <details>, then waits for hidden outputs to render. This gives the agent a realistic model of side effects and timing. It does not mention failure modes or timeout behavior, but the core behavior is transparent.

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?

Three tight sentences: purpose, target semantics, and usage guidance. Every sentence adds value and the key 'Use before...' instruction is placed at the end, after the mechanism, so the flow is natural and efficient.

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 UI-preparation tool with no output schema and no annotations, the description covers what the tool does, what target accepts, what side effects occur, and when to call it. A slightly fuller account of timeout_s or postcondition behavior would make it complete, but nothing essential for a correct call is missing.

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 description coverage is 0%, so the description must compensate. It thoroughly explains target, including accepted value types. However, app_id and timeout_s receive no semantic explanation beyond their schema titles/default, and timeout_s behavior in particular is left to inference.

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 opens with a specific verb and resource ('Bring an element into view') and clarifies exactly what target means: an element id, or a tab/accordion/panel/<details> label. It clearly distinguishes itself from siblings like click or read_outputs by describing a preparatory action, not a click or read.

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?

It explicitly tells the agent when to use the tool: 'Use before read_outputs or screenshot on hidden elements.' This is clear contextual guidance. It does not mention when not to use it or name an alternative tool for the same job, so it falls just short of a 5.

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

stop_appB

Close the browser page and, for launched apps, stop the app process.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden itself. It transparently states that it both closes the browser page and stops the app process, which is meaningful for an agent deciding whether this operation is appropriate. It does not mention effects of stopping an app not previously launched or whether the operation is reversible, but the core behavior is disclosed.

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, compact sentence with no filler. The close action is front-loaded, and the 'for launched apps' qualifier clarifies scope without adding unnecessary detail.

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?

The tool is simple, with one parameter and no output schema, so the description covers the basic purpose. However, it is missing guidance on where app_id comes from, when the browser-page-close behavior occurs, and what happens for apps that were not launched by this system, leaving meaningful gaps.

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 never mentions app_id or how it should be obtained. The agent is left to infer that app_id identifies the launched app, with no guidance on its format or relationship to sibling tools like launch_app.

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 states a specific action pair — closing the browser page and stopping the launched app process — which clearly identifies the tool's purpose. It also differentiates itself from the sibling launch_app by describing the inverse lifecycle operation.

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?

The phrase 'for launched apps' implies the tool is used when an app was started with launch_app, but it doesn't explicitly state when to use this tool versus alternatives or when not to use it. No exclusion criteria or fallback options are provided.

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

upload_fileB

Upload the local file at path into the file input id, then wait for the app to settle.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
pathYes
app_idYes
timeout_sNo

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are present, so the description carries the burden of behavioral disclosure. It does disclose a meaningful behavior: the tool waits for the app to settle after uploading. However, it omits side effects, failure modes, permissions, timeout behavior, and what happens if the upload fails.

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 a single, tightly worded sentence that front-loads the action and adds a relevant post-condition. There is no filler, and every phrase contributes to understanding the tool's behavior.

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?

With no annotations and no output schema, the description is the only source of behavioral and contextual detail. It does not explain `app_id` or `timeout_s`, does not say when to prefer this over siblings, and gives no indication of success/failure or return behavior. This is a meaningful gap for a 4-parameter mutation 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?

Schema description coverage is 0%, so the description must compensate. It adds meaning to `path` (local file) and `id` (file input), which goes beyond the bare schema titles. But `app_id` and `timeout_s` receive no semantic explanation, leaving their roles mostly implicit.

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 names a specific action ('Upload the local file at path') and a specific target ('file input id'), so an agent can tell what resource is acted on. It does not explicitly distinguish itself from siblings like attach or set_inputs, but the file-input framing is concrete enough to be clear.

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 its use case: upload a local file into a file input and then wait. It does not provide explicit when-to-use guidance, exclusions, or alternatives, so the agent has to infer when this tool is appropriate relative to siblings.

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. 12 tool updatesv0.1.0
    • First observedattach
    • First observedclick
    • First observedget_console
    • First observedget_errors
    • First observedlaunch_app
    • First observedlist_controls
    • First observedread_outputs
    • First observedscreenshot
    • First observedset_inputs
    • First observedshow
    • First observedstop_app
    • First observedupload_file

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation5/5

Every tool targets a distinct action: lifecycle (attach, launch_app, stop_app), UI inspection (list_controls), interaction (set_inputs, click, show, upload_file), output reading (read_outputs), and diagnostics (get_errors, screenshot, get_console). No two tools overlap in purpose, making misselection highly unlikely.

Naming Consistency5/5

All names follow a consistent verb_noun pattern in snake_case (e.g., launch_app, set_inputs, read_outputs). Single verbs like attach and click are still clear and fit the pattern, with no mixed conventions or vague terms.

Tool Count5/5

12 tools is well-scoped for a Shiny app interaction server. Each tool covers a necessary capability for starting, controlling, inspecting, and debugging apps, without redundancy or bloat.

Completeness5/5

The surface covers the full lifecycle from launch to stop, all common input interactions, output reading, and error/console diagnostics. No obvious gaps exist for typical Shiny testing workflows, making the set self-sufficient.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables agents to drive a running React application through typed MCP tools, using the same actions as the UI instead of browser automation.
    10 npm
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables coding agents to read and modify the state of web apps (Vue, React, Svelte, Pinia, router) through MCP, acting as headless devtools.
    201 npm
    34
    MIT