Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
UI_AUTOMATION_PROFILENoConfiguration for the automation profile, parsed once per server process.
UI_ACTIVE_IFRAME_SELECTORNoSelector for the active iframe used by UI tools.
VTABLE_ACTIVE_IFRAME_SELECTORNoSelector to override the VTable active iframe.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
case_execution_panelB

用例执行台:选择用例 -> 提交 -> 后端工具执行 -> 展示结果。

mold_master_entryB

模具主数据录入:由内置样例数据驱动的动态表单。

request_approvalA

Request human approval before proceeding with an action.

Call this tool proactively whenever you are about to take a significant or irreversible action and want the user to confirm first. Do NOT wait for the user to ask you to seek approval — use your judgment about when confirmation is appropriate.

The user will see an approval card with the summary, optional details, and Approve/Reject buttons. When they click a button, their decision appears as a message in the conversation (as if the user typed it), like:

"Deploy v3.2 to production" — I selected: Approve

or:

"Deploy v3.2 to production" — I selected: Reject

IMPORTANT: After calling this tool, you MUST stop and wait for the user's response. Do not continue, do not take any other actions, do not generate further output until you see the "I selected:" message. If approved, continue with the action. If rejected, acknowledge and ask how to proceed.

chooseA

Present the user with a set of options to choose from.

Call this tool when you need the user to make a decision between discrete alternatives. Use it proactively — don't ask the user to type their choice in chat when you can present clean, clickable options instead.

The user will see a card with one button per option. When they click one, their choice appears as a message in the conversation (as if the user typed it), like:

"Which deployment strategy?" — I selected: Blue-green

IMPORTANT: After calling this tool, you MUST stop and wait for the user's response. Do not continue or take any other actions until you see the "I selected:" message.

list_filesA

List all uploaded files with metadata.

read_fileB

Read an uploaded file's contents by name.

file_managerB

Upload and manage files. Drop files here to send them to the server.

generate_prefab_uiA

Execute Prefab Python code in a sandbox and render the result.

The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the components tool to look up available components and their import paths.

Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written:

from prefab_ui.components import Column, Heading, Text, Row, Badge
from prefab_ui.app import PrefabApp

with PrefabApp() as app:
    with Column(gap=4):
        Heading("Dashboard")
        with Row(gap=2):
            Text("Revenue: $1.2M")
            Badge("On Track", variant="success")

For interactive UIs, pass initial state as a dict and use .rx on stateful components for reactive bindings:

from prefab_ui.components import Column, Slider, Text
from prefab_ui.app import PrefabApp

with PrefabApp(state={"threshold": 50}) as app:
    with Column(gap=4):
        slider = Slider(value=50, min=0, max=100, name="threshold")
        Text(f"Threshold: {slider.rx}%")

slider.rx produces {{ threshold }}, a template expression that resolves against client-side state. Use Rx("key") directly, or apply pipe filters: Rx("balance").currency() produces {{ balance | currency }}.

Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n).

Charts live in prefab_ui.components.charts:

from prefab_ui.components.charts import BarChart, ChartSeries

BarChart(
    data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}],
    series=[ChartSeries(data_key="rev", label="Revenue")],
    x_axis="month",
)

Values passed via data are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work.

Layout patterns:

  • Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use Card(css_class="p-6").

  • Use Grid(columns=N, gap=4) for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: Grid(columns=[2, 1], gap=4) gives a 2:1 ratio.

  • Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default.

  • Column and Row accept gap (Tailwind scale: 1-12), align (cross-axis), and justify (main-axis) as native props — prefer these over raw css_class for spacing.

  • Use css_class="overflow-hidden" on containers if chart or content edges should clip to the container boundary.

Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call.

search_prefab_componentsA

Search the Prefab component library.

Use this tool to look up exact argument names, accepted values, and usage examples before writing component code. The skill covers patterns and layout; this tool has the API details.

The query matches component names and descriptions. Space-separated terms match independently, so "Card Badge Metric" returns all three.

When a query matches a small number of components, full details (docstrings, args, examples) are shown automatically. For broad searches, a compact listing is returned instead. Use detail to override this behavior.

Args: query: Filter by component name or description. Space-separated terms are OR-matched. detail: Show full docstrings and args. Defaults to automatic (detailed for ≤5 matches, compact otherwise). limit: Max components to return in detail mode (default 8). No limit in compact mode.

test_case_tableB

调拨订单测试用例总表:内置样例数据,支持搜索/排序/分页。

vtable_engine_dashboardB

VTable 引擎概览仪表盘:模拟表格实例状态 + 用例分布图。

mold_master_viewA

模具主数据只读视图:渲染全部字段(内置样例)。

browser_openC

打开 Playwright 浏览器并导航到目标页面(后续工具复用同一浏览器)。

browser_startB

在指定端口启动受管 Chrome,并自动通过 CDP 接管。

browser_connectA

经 CDP 连接一个已运行的浏览器,默认连接 9222 端口。

复用外部浏览器与其已打开的 VTable 页面(含页面内的实例),无需重新导航; vtable_cell_click / ui_snapshot 等工具直接驱动该页面。 关闭时仅断开连接,不关闭外部浏览器进程。

browser_sessionC

管理隔离 BrowserContext 会话,支持账号 Cookie 环境切换和 storage state 持久化。

browser_pagesA

列出所有 BrowserContext 的标签页及稳定 page_id,并标记当前选中页。

browser_select_pageA

显式选中一个 page_id;后续页面、iframe、浮层和 VTable 工具固定使用该页。

browser_closeA

关闭 Playwright 浏览器,释放资源。

CDP 连接的外部浏览器只断开连接,受管 Chrome 和 Playwright 浏览器则关闭。

ui_clickA

统一点击页面控件,并即时返回 Portal、提示和聚焦浮层。

可同时传多个来自分析结果的候选定位;执行顺序固定为 CSS → AX role/name (可带 description) → XPath → text/placeholder → 顶层视口绝对坐标。坐标仅作为 最终回退,且传 analysis_id 时会拒绝陈旧的 VTable 分析坐标。

overlay_scanA

扫描当前页面范围内可见的 Ant Design Portal / ARIA 浮层。

默认 scope=active 只扫描主文档和当前激活 iframe;scope=all 才扫描所有 iframe。 返回每个浮层的 kind、文本、role、定位摘要、可见性、box 以及所属 frame。 对短暂 message/toast,请改用 ui_clickvtable_cell_click(observe_after=True),以免在单次静态扫描前消失。

ui_page_contextA

返回当前页面、活动 iframe 和聚焦浮层的紧凑上下文。

这是 AI 每次准备下一步交互时的低 token 入口;只有需要详细控件树时 才继续调用 ui_snapshot。

ui_analyze_scopeA

只分析当前活动页面范围或所聚焦浮层内的可操作控件。

有 Modal/Drawer/Dropdown/Popover 时裁剪底层页面;否则只扫描顶层当前文档与 激活的 AntD Tab iframe。结果是紧凑 role/name/CSS 定位清单,不展开整页 DOM。

overlay_observeA

在限定窗口内收集 Ant Design Portal/ARIA 浮层事件,覆盖全部 iframe。

适合已由其他工具或人工操作触发页面交互后的诊断;默认在取样后停止监听。

ui_interactA

在当前页面/活动 iframe 中执行统一 DOM 交互并返回聚焦浮层结果。

分析器返回 CSS 时优先 CSS;否则按 AX role/name/description、XPath、text/ placeholder 依次尝试。x/y 是顶层 viewport 绝对 CSS 像素,只在前述候选都无法 解析时作为可信点击回退。坐标应直接取自 vtable_analysis,带 analysis_id 会在 执行前校验页面、iframe、滚动和布局。expect_input=True 时会验证 本次交互后是否真的出现并聚焦 input/textarea/contenteditable。未显式指定 frame 时优先当前激活的 AntD Tab iframe,再回退顶层文档。分析结果中的 frame="active" / "top" 可固定上下文。默认点击后立即 观察 Portal、消息、下拉和通知,限制 max_results 以控制 MCP token。

ui_snapshotA

抓取页面 aria 快照(mode='ai' + boxes),给 AI 一张"语义之眼"。

官方 Playwright MCP 范式:把 accessibility 树(含 [ref=xx] 引用和 [box=x,y,w,h] 视口坐标)喂给 AI。VTable 本体是 canvas(单元格不进 a11y 树,仍走确定性几何定位), 但工具栏/弹窗/编辑器输入框都在树里 —— 交互前先读快照,再决定点哪个。 selector 非空时只快照该选择器命中的子树。

frame=None → 主页面;frame="active" → 当前激活的 AntD Tab iframe; frame="vtable" → 自动定位含表格的 iframe; 其它值按 iframe name 或 URL 子串匹配(如 "application" / "scm-spo")。

ui_screenshotB

截取指定 DOM 元素或顶层 viewport 区域并返回受限大小的图像。

元素定位顺序与 ui_interact 相同:CSS → AX role/name/description → XPath → text/placeholder。frame 未指定时优先活动 iframe。若没有可用定位器,可传 x/y/width/height 使用顶层 viewport CSS 像素矩形;截图不会静默把 iframe 内坐标 当成顶层坐标。结果包含 base64 图像、裁剪框、frame、定位来源和摘要哈希。

vtable_cell_infoA

读取 VTable 单元格信息:值/行为分类/编辑能力/中心点/是否在视口。

交互前后各调一次,让 AI 确认目标与结果(Playwright MCP 的验证回路思想)。

vtable_cell_clickA

点击 VTable 指定单元格(col/row,0 起)。

流程:绑定实例 → 滚动到视口 → VTable API 取确定性中心点 → trusted 鼠标点击 (真实输入管道,isTrusted=true)→ 回读选中区间/编辑器状态验证,未命中自动重试。 observe_after=True 时会在点击前监听主页面和全部 iframe,并在点击后立即 返回 Ant Design Portal/消息/下拉浮层的新增事件与可见状态。

vtable_cell_resolveA

用 VTable 内部 API 将业务字段和记录索引解析为单元格地址。

优先调用 getCellAddrByFieldRecord,旧版本实例才回退到 getTableIndexByField + getTableIndexByRecordIndex。不会扫描 DOM 或猜测坐标。

vtable_cell_click_by_fieldB

按业务字段 + 记录索引点击 VTable 单元格。

地址、滚动和中心点全部由 VTable 内部 API 解析,然后使用 Playwright trusted mouse 输入;AI 不需要也不能为该工具提供像素坐标。

vtable_metaA

读取 VTable 规模/冻结行列/主题等元数据(防御性取值)。

AI 先拿到 rowCount/colCount/frozenRowCount,再规划批量读取范围与滚动策略。

vtable_analysisA

扫描当前 VTable 的列头、交互图标和有限值单元格的交互证据。

结果只来自 VTable API 和已渲染 scenegraph,不会点击或展开 canvas DOM。每个 表头/单元格及其图标都附带顶层页面 viewport 绝对坐标;editor 中的 click_opens_dom_input 表示该单元格已有 editor,且 VTable 配置允许单击触发 原生输入控件。把其中 geometry.point 原样交给 ui_interact 即可执行。 同一 iframe 内有多张可见 VTable 时,首次调用只返回极简表格目录;从中选择 table_index 再分析,避免把坐标落到另一张表。默认 interactive 模式只展开有 交互证据且当前可见的样本,不返回业务值;可用 fields 缩小字段范围。诊断时才 使用 mode="full"、include_values=True 或 visible_only=False,以控制 MCP token。

vtable_read_cellsB

批量读取矩形区域(col0,row0)-(col1,row1)单元格值(行优先)。

vtable_drop_filesA

把服务端本地文件拖放到指定 VTable 单元格(Playwright 1.60 Locator.drop)。

落点由 VTable getCellRelativeRect 换算成 .vtable 容器相对坐标,精确命中目标格。 files 为服务端文件路径列表(如 data/demo.xlsx);data 可附带剪贴板式键值。

ui_profileA

返回当前页面 Profile、定位顺序和 VTable 点击验证顺序。

automation_metricsB

返回浏览器侧工具的近期耗时、响应体积和上下文 token 估算。

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
Prefab Generative Renderer
vtable_js_inventoryVTable JS 脚本目录:所有脚本名与说明(JSON)。
Prefab Renderer (test_case_table)
Prefab Renderer (vtable_engine_dashboard)
Prefab Renderer (mold_master_view)
Prefab Renderer (case_execution_panel)
Prefab Renderer (mold_master_entry)
Prefab Renderer (request_approval)
Prefab Renderer (choose)
Prefab Renderer (file_manager)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hooplus1ce/Qa-Automation-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server