Skip to main content
Glama
615,442 tools. Updated 2026-09-27 05:19

"Element" matching MCP tools:

  • Update an existing element by `type` and `id`, changing ONLY the fields you pass — omitted fields are preserved. This is a server-side read-merge: the current element is loaded and only the keys in `fields` are applied, so it is safe against the raw-HTTP-PATCH hazard where sending a partial link array replaces the whole array. Semantics per field kind: a text field you pass is set (pass an empty string `""` to clear it); a multi-link field you pass REPLACES that field's array wholesale (pass an empty array `[]` to clear it) — for additive/subtractive link edits that leave the rest of the array intact, use `edit_links` instead. `type` is a slug from `list_element_types`; `id` is the element's UUID. Requires a WRITE API-Key. Returns the full updated element in the v2 wire shape. Errors if the element does not exist, or (naming the field) on an unknown field or a bad link target.
    ConnectorNo auth
  • Update a project's metadata: rename, change description, move to a different folder, or change aspect ratio. Only fields you provide are changed. To move a project to the workspace root, pass folder_id="" (empty string). Aspect ratio: pass any "W:H" (positive integers). The canvas is fit inside 1920×1080 keeping the ratio, so element pixel coordinates use the resulting canvas. Common values: - "16:9" → 1920×1080 (landscape, YouTube/web — default) - "9:16" → 608×1080 (portrait — TikTok/Reels/Shorts) - "1:1" → 1080×1080 (square — Instagram feed) - "3:4" → 810×1080 (portrait card) - "4:5" → 864×1080 (portrait — Instagram feed) Element coordinates are stored as fractions of the canvas, so existing elements reflow to the new canvas automatically — no element coordinates are rewritten. Concurrency: whole-project mutation (conflict domain: the entire project) — serialize. Do not run it in parallel with ANY other mutation on the same project_id, including element/voiceover edits; run them one at a time. (Mutations to different projects run in parallel freely.)
    ConnectorNo auth
  • Generate an AI image or canvas-code-based animation directly into a clip. - kind="image": text-to-image. Pass `prompt`. Optional: `animation_setting` (entry/exit — set it HERE, see below), `style_id` (from find type='image_gen_style_packs'), `reference_image_url` or `mcp_upload_id` for image-to-image grounding. - kind="animation": canvas-code animation rendered from a prompt. Pass `prompt`. Optional: `voiceover_text` (drives timing), `base_component_id` (reuse a saved animation as the starting point), `reference_image_url` or `mcp_upload_id` for visual grounding. Generation is asynchronous: the element is created immediately with a stable `element_id` and rendered in the background. Poll `get_clip(select:['busy'])` — an EMPTY `busy` means the render has landed. (This previously said to watch the `phantom` flag; `phantom` has never been a key get_clip returns, so there was nothing to poll.) Set presentation up front. `animation_setting` is applied to the element as it is created, so the image enters correctly the first time it renders. Doing it afterwards with `update_elements` means writing to the element that is still generating, which is the write most likely to be refused while the generation holds it. `group` is NOT accepted here, unlike `add_elements`: a generated element is built in the background, and the grouping would be overwritten when the render lands. Add it ungrouped, then call `update_elements` with `group` once it appears. Tip: use this tool whenever the user asks for a "generated", "AI", or "create me a" visual. For uploaded photos / logos / icons / GIFs, use `add_elements` with `element_type='image'` and a `src` or `mcp_upload_id` instead.
    ConnectorNo auth
  • Perform and record one action step on the device. Performs the action and records it with automatic page source + element capture. Coordinates are in video / iOS-automation space — use flow_recording_start's windowSize as the reference. Actions: - tap / doubleTap / longPress / swipe — gesture actions (require x,y; swipe also needs toX,toY) - sendKeys — type text into the focused field - keyPress — press an Android keycode (e.g. 3=HOME, 4=BACK) - wait — pause for waitMs milliseconds - pressButton — press a hardware button by name ('home', 'volumeUp', 'volumeDown', 'lock'). Performed live on the device during recording. Android maps to hardware keycodes; iOS invokes the native hardware-button command. - assert — record a UI assertion check (no device gesture). Identifies the target element at (x,y), then at replay time verifies the assertion condition. Assertion failures mark the step as FAILED and surface the mismatch in errorMessage. Makes the recording a real verifiable test. assertType 'visualMatch' is the exception: it takes no x/y and no expected, and at replay time compares the whole screen against the screenshot captured now. - scrollToElement — record a scroll-until-visible checkpoint (no device gesture). Binds the element at (x,y) now; at replay time it scrolls until that element is back on screen, searching downwards first and then upwards, and reports the element's live coordinates. Use it before acting on something whose position varies between runs (a row in a long list, a button below the fold). This FAILS the run if the element never comes into view, because the step exists to bring a target into view for the step that follows it. Note you do NOT need a separate step to resolve an element before acting on it — every element-bound action re-resolves its own target at replay; use scrollToElement only when the target is genuinely off screen, and assert/exists when its absence should fail the run. - appLaunch — launch an app mid-flow by appId (Android package name, iOS bundle id; optional appActivity on Android). Launches live during recording and relaunches the same app at replay time. Use it to switch apps or to return to the app under test after leaving it.
    ConnectorOAuth
  • Get the UI hierarchy (page source) of an iOS device — THE single source of truth for element coordinates (physical screen points). Default format is "description": a compact list of visible named elements as `Type: "name" @ (cx,cy) WxH`, where (cx,cy) is the element CENTER and the exact tap point; when the visible text differs from the name (an app that sets accessibility identifiers) it is appended as label="…", and the element holding focus is flagged [focused] — on an Apple TV that is the element tvos_select/tvos_focus acts on. Prefer acting on these labels via ios_tap_by_label rather than tapping raw coordinates. Elements with 0-width/height bounds (e.g. bottom-tab labels) are flagged [zero-area] — they cannot be tapped by coordinate; use ios_tap_by_label instead. FINDING THINGS IN LONG LISTS: pass `search` to grep the WHOLE hierarchy (including elements scrolled off-screen) — matches below the fold are flagged [off-screen]; bring them into view with ios_scroll_to_element, don't swipe blindly. To disambiguate duplicate labels, filter by `type` or use ios_find_element (strategy "accessibility id"). Use format "xml" to JUDGE FROM THE TREE instead of trusting a coordinate: with `label` it returns the COMPLETE SUBTREE of that element (a sign-in dialog is ~15 lines, where the whole tree is ~185k characters and will not fit in a response), and without it the tree comes back with anonymous layout containers pruned — nothing findable is ever hidden behind a pruned ancestor. Reach for the subtree whenever you need attributes the compact format omits: value, placeholderValue, focused, enabled. Requires an active iOS automation session (auto-starts if needed).
    ConnectorOAuth
  • Evaluates UI elements for accessibility issues that automated scanners miss. COST: $0.01 USDC via x402 on Base-compatible EVM network per call. Checks beyond what axe/Lighthouse/WAVE catch at the design stage: - Touch targets below 24×24px (WCAG 2.5.8 AA hard fail) - Touch targets below 44×44px (WCAG 2.5.5 AAA recommended) - Information conveyed by color alone without a secondary indicator (WCAG 1.4.1) - Missing focus indicators on interactive elements (WCAG 2.4.7) - Focus rings thinner than 2px (WCAG 2.4.11) - Focus ring contrast below 3:1 against adjacent background (WCAG 2.4.11) - Interactive elements below the practical usability height floor Args: - elements: Array of 1–50 UI element objects - screen_name: Optional label for the evaluation report Each element requires: element_type. Provide width_px/height_px for touch target checks. Provide uses_color_only + secondary indicator flags for 1.4.1 checks. Provide is_interactive + focus_visible + focus indicator properties for focus checks. Returns: Structured report with: - Per-element scores (0–100) and specific issues - Severity levels (critical/major/minor) with WCAG references - What automated tools miss and why - Concrete fix recommendations - Overall score and verdict (pass/needs_work/fail) - Top issues sorted by severity
    ConnectorNo auth

Matching MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables interactive element inspection on any website, allowing users to click elements and send detailed information (tag, classes, styles, attributes) to Claude for analysis.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Connects Claude with Matrix/Element to read and search messages across rooms. Enables listing rooms, viewing room information, retrieving message history, and searching conversation content from your Matrix account.
    4
    1
    MIT

Matching MCP Connectors

  • Build a coordination report for a translated Navisworks model: translation status/progress, derivative outputs, available views (2D sheets / 3D viewables), total element count, and a per-category element breakdown. Doubles as the canonical way to poll translation status after nwd_upload. When to use: after nwd_upload to check whether translation has completed before calling clash/object tools; at the end of a coordination session to generate a status snapshot for the weekly BIM report; when auditing a model revision to confirm expected element counts per discipline. When NOT to use: do not use for a per-element property dump — use nwd_list_objects; do not use for clash results — use nwd_get_clashes. APS scopes required: viewables:read data:read bucket:read (read-only). Rate limits: APS default ~50 req/min per endpoint; this tool issues up to 4 sequential APS calls (manifest, metadata, properties — two with retry). When polling for translation completion, backoff: 5s, 10s, 30s, 60s, 120s — Model Derivative NWD translation typically completes in 1-10 min but large federated models can take 20+ min. Errors: 401 APS token expired (retry); 403 missing scope (report); 404 URN not found (model was never uploaded or bucket TTL expired); 409 N/A; 422 translation failed permanently — inspect report.translation_status == "failed" and report.derivatives[].status; 429 rate limit (backoff); 5xx APS upstream (retry once). Property extraction may legitimately 202 "isProcessing" — the tool handles retry and then silently swallows to still return manifest/metadata (element_count will be 0 until properties index is built). Side effects: none. Pure read. Idempotent — report reflects current APS state. Logs usage to D1 usage_log.
    ConnectorNo auth
  • Change fields on the element with the given id by merging in a partial element — only the keys you include change. The id may be any element ANYWHERE in the tree, including one nested inside a group (or its mask). Pass a whole nested value (e.g. a new `keyframe_animations` array) to replace that key; set a key to null to remove it. This is for TWEAKING an existing composition. To create a composition or change many elements at once, edit the JSON and call set_project instead. The result is re-validated before being accepted.
    ConnectorNo auth
  • Add many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch. SEND LESS. Most batches repeat themselves — the same clip_index, element_type, font_setting, alignment or gradientSetting on every item. Hoist those into `defaults` and send them once; each item then carries only what differs, and overrides any key it sets (type_data merges one level). On a 20-30 element batch this typically cuts the call by a quarter to a half. `returning` shapes the response the way `select` shapes a get_clip read. defaults: { clip_index: 2, element_type: 'text', type_data: { font_setting: { font: 'Inter', weight: '600' }, alignment: 'center' } } elements: [ { name: 'headline', x: 960, y: 400, type_data: { text: 'Hello', fontSize: 120 } }, ... ] Use after calling get_element_schema to confirm the type_data shape per element_type. Items within one call are applied in order; returns one result entry per input item so partial success is fine. Reuse instead of rebuilding: an item may pass `component_id` INSTEAD of element_type/type_data to insert a saved component from this workspace exactly as stored — no generation, instant — returning every new element_id plus its parameter_schema; set its content afterwards with update_elements(type_data.parameter_values). Find them with find(type='element_components'). Use `base_component_id` (with element_type='animation' and a prompt) only when you want a NEW variant rather than that component. Z-order: list position IS z-index — later renders on top — and a new element goes on top by default. Pass `insert_at: 'back'` to put it behind what's already there, or `insert_at: {before: id}` / `{after: id}` to land next to a specific element — that also puts the new element in THAT node's group, which is the only way to place inside one. `reorder_elements` rewrites the whole order in one call, grouped clips included. `group` + `insert_at: {before|after}` together: what the reference is relative to decides what gets positioned. Point at a node INSIDE the group and the ELEMENT takes that slot among its new siblings. Point at one OUTSIDE it and the GROUP takes that slot, with the element inside — which is how you put a backdrop pattern of N elements at a chosen depth as one hideable unit: hoist both into `defaults` and the first item seats the group, the rest just join it. The one refusal left is naming a reference outside a group that already exists somewhere else, since moving an established group is not what adding one element to it should do; seat the group where you want it in the call that CREATES it, because there is no reposition afterwards. `front`/`back` with a `group` follow the same principle: they address the GROUP only while the element is alone in it — the call that creates it — and once the group has other members they address the ELEMENT within the group's interior, so they will not move an established group either. Grouping: pass `group: "<name>"` to keep a unit together (a card and its label, a stat and its caption) so the user can move or hide it as one thing. Items in one call sharing a name land in the same group, and a later call with that name adds to it. Grouping never changes coordinates. It does affect z-order: a group's members render contiguously at the group's slot, and a NEW group takes the slot of its first member, so grouping already-adjacent elements keeps their z-position while grouping scattered ones pulls them together at the lowest member's slot. Concurrency: within ONE call every element lands in a single save. Across calls the conflict domain is the CLIP's element list, not the individual element, so you can fan this tool out across parallel subagents targeting DIFFERENT clips. Two concurrent add_elements calls on the SAME clip are NOT safe: every add claims that clip's element list, so the later call is REJECTED ('changed since this edit was based on') and nothing it sent is written — batch all of a clip's elements into ONE call instead. A rejection is not last-write-wins: re-read and re-apply. Do NOT run it concurrently with a whole-clip or whole-project mutation on the same guide (update_clips on that clip, add_clips/remove_clip/split_clip/duplicate_clip, add_audio, update_project) — those rewrite a larger scope and would clobber the element. Element-type quirks (handled per-item): • zoom → x/y/width/height are ignored; use centerX/centerY in type_data • image → provide x/y/width/height (the clip is located by clip_index; the clip_id input is accepted but unused) • animation → x/y/width/height default to the full canvas if omitted (the clip is located by clip_index) For everything else, x/y/width/height are required. Animation: pass a top-level `keyframes` array (sibling of x/y/type_data, NOT inside type_data) — entries are { timestamp, positionX?, positionY?, width?, height?, interpolation? } in canvas pixels. positionX/Y use the SAME alignment-aware origin as the element's x/y. Text caveat: width/height are not keyframable on text — animate its size with fontSize (letterSpacing/lineHeight/padding* are also keyframable). Position origin: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top; `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right. To centre a label in a row, pill, chip, card or beside an icon: pass the container's centre line as y with y_anchor:'center'. The server centres the measured text in it, so it is one number and it holds for wrapped text. Add type_data.fit{max_height} whenever the text could wrap, so the box stays inside the space you gave it. y_anchor is a directive for computing the stored y, not a property that sticks — repeat it on any later call that moves the same label.
    ConnectorNo auth
  • Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch. SEND LESS, GET BACK LESS. `defaults` carries what every item shares (clip_index, element_type, and type_data entries like font_setting or alignment) so you send it once instead of per item; each item overrides any key it sets. `returning` declares what comes back, the way `select` shapes a get_clip read — omit it for a sensible default, or pass [] for just the counts. defaults: { clip_index: 1, element_type: 'text', type_data: { font_setting: {...} } } returning: [] → { total, succeeded, failed } only returning: ['layout'] → + the measured text fit per element returning: ['qa.codes'] → + the clip audit with prose stripped from non-errors (any returning value → error findings regardless; only warnings are opt-in) Each item can update position/timing fields alone, or type-specific fields via type_data (use get_element_schema in 'update' mode to see what's settable for an element_type). Items within one call are applied in order; partial success is fine. You do NOT need clip_index here — an element_id is unique within the project, so the server locates the clip itself. Pass it only as a hint; a wrong one is corrected rather than rejected. Grouping: pass `group: "<name>"` to move an element into a named group (created on demand), or `group: ""` to pull it back out to the clip root. Several items sharing a name collect into one group — the way to tidy loose elements into units the user can move or hide together. Grouping never changes coordinates. It does affect z-order: a group's members render contiguously at the group's slot, and a NEW group takes the slot of its first member, so grouping already-adjacent elements keeps their z-position while grouping scattered ones pulls them together at the lowest member's slot. Customising a component: after add_elements(component_id=...), set its content here with type_data.parameter_values on the animation element it returned. Concurrency: parallel-safe (conflict domain: the individual element), same as add_elements — fan out across subagents as long as they touch DIFFERENT element ids — those carry different entity paths and both land. Two concurrent edits to the SAME element id do NOT merge and do NOT last-write-win: the later one is REJECTED ('changed since this edit was based on'), nothing is written, and you must re-read and re-apply. Do NOT run concurrently with whole-clip/whole-project mutations on the same guide (update_clips on that clip, structural clip ops, add_audio, update_project). Keyframes: pass a top-level `keyframes` array (sibling of x/y/type_data, NOT inside type_data) to set, or null to clear. Per-entry shape: { timestamp, positionX?, positionY?, width?, height?, interpolation? } in canvas pixels; positionX/Y use the element's alignment-aware origin. Text elements: pass `fit_to_lines: N` to run an automatic widen + font-shrink pass after the entry's regular update lands. The server reshapes the element so the rendered text wraps to at most N lines without overlapping its neighbours.
    Connector
    Destructive
    No auth
  • Reorder the elements inside a clip. List position IS the z-index — later entries in `ordered_element_ids` render on top of earlier ones. You MUST pass the full set of element IDs currently in the clip. The handler rejects partial lists so a reorder can never silently drop an element. Get the current list via get_clip — the order it returns is exactly the order this takes. Works on grouped clips. Elements keep their group; moving a group's members together moves the whole group relative to everything else. The one thing a group cannot do is render in two pieces, so an order that puts a non-member BETWEEN two members of the same group is rejected and names the group — put the group's elements next to each other, or take the element out of the group first with update_elements(group).
    ConnectorNo auth
  • Remove an element, a group or an audio track from a project. - target="element": removes an element (requires element_id, or element_ids for several). clip_index is optional — the element is located by id; pass it only as a hint - target="group": removes a GROUP node (requires clip_index + group_id). By default its children survive — they rise to the removed group's own parent, which for a top-level group is the clip root. Pass keep_children=false to delete the whole subtree instead, every nested group and every element inside it. - target="audio": removes a music/SFX track (requires music_id — returned by add_audio) Concurrency: target='element' is element-scoped (conflict domain: the individual element) — parallel-safe with other element edits on different elements, same as remove_elements. target='audio' is a whole-project mutation — serialize it against any other mutation on the same project_id. (Mutations to different projects run in parallel freely.)
    Connector
    Destructive
    No auth
  • Replay a stored recording against a device: each step's element is re-resolved from its recorded locators, then the recorded action is performed again. Reports per step which locator worked, whether it RECOVERED (the recorded one failed and an alternate matched — that step's locator needs attention before it fails outright), whether the element's accessible name drifted, and any state that changed since recording (a button now disabled, an element now hidden). Web steps only: native steps and steps recorded by coordinates come back `unsupported` rather than being replayed blind onto whatever now occupies that point.
    ConnectorOAuth
  • Wait until an element appears on screen, polling the accessibility tree. Counterpart of device_wait_for_element. Matches a case-insensitive SUBSTRING against label, name, value and placeholder. Returns { found, waitedMs, element? }. found=false is a normal answer, not an error — it means the element did not appear within the timeout, which is often the assertion you wanted. Matches elements the tree reports whether or not they are on screen, so a hit does NOT prove visibility; check element.visible. Requires an active iOS automation session.
    ConnectorOAuth
  • Create and/or update many elements across any of the 22 types in one call. Each entry in `items` is `{"type": <slug>, "element": <payload>}` with the same payload shape `create_element` takes: an `element` with an `id` UPDATES that id (creating it if absent), an `element` without an `id` CREATES a new element. Items may reference each other by id, including a forward reference to a sibling later in the list. There is NO delete: bulk_apply never removes an element. When `atomic` is false (default), items succeed or fail independently and the response reports each outcome; when `atomic` is true, ANY item failure rolls the whole batch back and nothing is committed. Up to 1000 items. Requires a WRITE API-Key. Returns the batch response verbatim: `{errors, items: [{status, id, created_at, updated_at} | {status, id, error}, ...]}` — `errors` true means at least one item failed (and, under `atomic`, that nothing committed).
    ConnectorNo auth
  • Find a UI element by text, content-description, or resource-id and tap it. NOT always usable — for elements without stable text/contentDesc/resourceId (image-only icons, custom Canvas widgets, dynamic/localized labels), use `device_tap(x, y)` with bounds from `device_page_source` instead. Both tools are first-class. When multiple nodes share the same text, this tool ranks candidates so an interactive widget (EditText, Button) wins over a passive label (TextView) — pass `resourceId` to pin a specific element. Returns after the tap is dispatched; an additional ~150ms focus-settle wait is included when the matched element is an EditText so a following `device_type` lands in the right field. CRITICAL: call this BEFORE `device_type` sequentially — do NOT issue both in parallel, or the type may race the focus change and write into the previously-focused field.
    ConnectorOAuth
  • Update an existing template: change its name, description, or replace its exercise list. When updating exercises, pass the complete exercises array (it replaces the existing list) — including each exercise's coach_note, which is cleared for any exercise that omits it, and each exercise's and set's id from get_template so the element keeps its identity (an element sent without an id is treated as NEW and gets a fresh id). Use get_template first to see the current state.
    ConnectorOAuth
  • Return the full CodePic shape reference — all element types, their fields, data payloads, and JSON examples. Call get_shape_catalog first for concise shape selection and container capabilities; use this tool when you need complete fields or type-specific data (e.g. select options, triangle direction, callout tail). No authentication required.
    ConnectorNo auth
  • One of the eight trigrams by exactly one identifier: binary (e.g. 010), english (e.g. Fire), chinese (pinyin, e.g. Li), symbolic (e.g. Radiance), or element (Chinese character, e.g. 火). This returns a single trigram; list_trigrams returns all eight. Data © IChing.Rocks — attribution is a condition of the license terms: https://iching.rocks/mcp-terms.
    ConnectorNo auth
  • Append a single element to an existing project — a TWEAK, e.g. dropping in one more caption or shape. By default it is added at the top level; pass parent_id to add it INTO a group (nested). The element is any valid schema element: video, image, text, shape, audio, group, caption, or particles. To create a composition or add several elements at once, build the JSON and use set_project instead. The new element is validated as part of the project as a whole before being added. Call get_schema(element_type) for the exact per-type fields; unrecognized keys are flagged.
    ConnectorNo auth
  • WCAG 2.5.5 / Apple 44pt tap-target audit for the web. Collects every interactive element (a, button, [role=button], input[type=submit/button/checkbox/radio], select, summary, label[for], [onclick], [tabindex>=0]) and emits a PER-ELEMENT fix table for any whose rendered width or height is below the minimum (default 44px): selector, role, visible text, measured w/h, pixel deficit per axis, and a concrete CSS fix. Sorted worst-first. Two modes: pass url (renders in headless chromium, measures real getBoundingClientRect) or pass elements[] snapshot (pure, no browser).
    ConnectorNo auth