Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

Pane

NPM · @PANEUI/MCP · SCANNED AUG 3

Hand a human a rich interactive UI by URL and get structured data back, from any MCP client.

Available components

+30 this week 74 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security87
  • No malware found by supply-chain analysis.Pass
  • Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.Partial
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency71
  • Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
  • Cryptographically verified build provenance (signed, bound to aerolalit/paneui). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 48 days ago).Pass
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability72
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6458 tokens (~239/item across 27 items; 26 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
  • Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @paneui/mcp

# add to Claude Code
claude mcp add aerolalit-pane -- npx -y @paneui/mcp
# add to Codex CLI
codex mcp add aerolalit-pane -- npx -y @paneui/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "aerolalit-pane": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@paneui/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add aerolalit-pane --command npx --arg -y --arg @paneui/mcp
# ~/.hermes/config.yaml
mcp_servers:
  aerolalit-pane:
    command: "npx"
    args: ["-y", "@paneui/mcp"]
// mcp.json
{
  "mcpServers": {
    "aerolalit-pane": {
      "command": "npx",
      "args": [
        "-y",
        "@paneui/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Aug 26 +54
    • Install scripts: unverified → pass security
    • Provenance: unverified → pass security
    • Known CVEs: unverified → partial security
    • Malware scan: unverified → pass security
    • The attested source repository moved: aerolalit/paneui security
    • Schema quality: 100 → unverified functional
    • Tool coverage: 100 → unverified functional
    • License: unverified → pass functional
    • Dependency health: unverified → partial functional
    • Maintenance: unverified → pass functional
    • MCP protocol: unverified → pass functional
    • Stability: unverified → 0.23 functional
    • Schema quality: unverified → good functional
    • Licence: MIT functional
  • 31 Jul 26 −7
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 +8
    • Malware scan: pass → unverified security
    • Schema quality: unverified → 100 functional
    • Tool coverage: unverified → 100 functional
  • 28 Jul 26 −26
    • Schema quality: 100 → unverified functional
    • Tool coverage: 100 → unverified functional
  • 27 Jul 26 44

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 3 Aug 2026 · Analysed npm/@paneui/[email protected]

Provenance verified

Ecosystem: npm · Outcome: verified

Reason: verified

Source repo:
aerolalit/paneui
Certificate issuer:
https://token.actions.githubusercontent.com
Certificate SAN:
https://github.com/aerolalit/paneui/.github/workflows/release.yml@refs/tags/v0.0.26
Rekor log index:
1809262898
Predicate type:
https://slsa.dev/provenance/v1
Subject digest:
sha512:ae965e3371fc074d588e96ea33ac4b001fcf444718342ce9fb5c278985cd6d7727fefd2285a4a5508e8b3ebce83f8fc61190f7f9bb59ae791057e0bce
Discovery method:
attestation_endpoint
Dependencies 96 packages

96 packages in the resolved dependency tree · 95 deprecated · 29 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

MCP tools — 26 exposed · ~6,414 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
agent ~199

Agent identity + binding. ONE tool with an `action` enum: whoami (the resolved relay URL, active profile, whether a key is configured — no network, no secrets) | claim (bind this agent to a human via a one-shot claim code from their Settings UI; one-way) | logout (clear the locally-saved key/profile; does NOT revoke it on the relay — use the `key` tool's revoke for that).

NameTypeReqDescription
actionstringyesAgent identity. whoami: show the resolved relay URL, active profile, and whether a key is configured (no network, no secrets). claim: bind this agent to a human via a one-shot claim code the human ge…
codestringThe one-shot claim code (required for claim).

No output schema declared.

No examples provided.

attachments ~450

Binary attachments (images, PDFs, audio, video) referenced from event payloads / input_data via `format: pane-attachment-id`. ONE tool with an `action` enum: upload | download | show | list | delete | mint_token | revoke_token | list_tokens. upload reads an ABSOLUTE file_path; download writes to an ABSOLUTE out_path (or returns base64). Scope an upload to agent (default, reusable), pane, or template. mint_token returns a /b/<token> capability URL (ONCE) a browser can GET without your API key.

NameTypeReqDescription
actionstringyesBinary attachment operations. upload: read a local file (file_path) and upload it; scope agent|pane|template. download: fetch bytes by attachment_id to out_path (absolute) or return base64. show: met…
attachment_idstringAttachment id. Required for download/show/delete/mint_token/revoke_token/list_tokens.
cursorstringlist pagination cursor.
file_pathstringupload: ABSOLUTE path to the local file to upload.
filenamestringupload: display filename (defaults to the file's basename).
limitintegerlist page size (1..100).
mimestringupload: advisory Content-Type (the relay sniffs the bytes regardless).
oncebooleanmint_token: token self-deletes on first GET.
out_pathstringdownload: ABSOLUTE path to write the bytes to. If omitted, the bytes are returned base64-encoded in the result.
pane_idstringRequired when scope=pane.
scopestringupload scope (default agent).
template_idstringRequired when scope=template.
token_idstringrevoke_token: the token id to revoke.
ttl_secondsintegermint_token: per-token TTL (clamped by scope default).

No output schema declared.

No examples provided.

create_pane ~962

Hand the human a rich interactive UI by URL and (optionally) get structured data back. Build the UI as inline HTML (pass `name` + `html`) OR reuse a saved template (pass `template_id`). The relay hosts it and returns a URL. ALWAYS give the returned url to the human — paste it into the conversation and ask them to open it. Reach for this whenever a text reply is the wrong shape: forms, approvals, pickers, surveys, dashboards, diff/doc review, wizards. If the page captures input it emits events back to you (poll them with get_events) or mutates record collections (the record tools). BEFORE authoring: call get_skill for the events-vs-records decision + schema grammar, and the `taste` tool (action: get) for the human's house style — both shape the HTML you write. Returns { pane_id, url, urls, title, expires_at }.

NameTypeReqDescription
callbackobjectOptional webhook callback config so the relay POSTs new events to your endpoint. Shape per the relay's callback schema (e.g. { url, secret? }). Most MCP agents poll with get_events instead.
context_keystringOptional natural key (e.g. 'pr-42'). Repeated create_pane calls with the same (template, key) return the SAME pane — makes retries idempotent.
event_schemaobjectInline form only. Declares which events the page (and you) may emit and validates each payload. Shape: { events: { '<type>': { emittedBy: ['page'|'agent'...], payload: <JSON Schema> } } }. OMIT for a…
htmlstringThe pane's UI as a complete inline HTML document. To send data back to you, the page calls window.pane.emit(eventType, payload) — every emitted eventType MUST be declared in event_schema with 'page'…
icon_attachment_idstringOptional per-pane icon as a ready raster-image attachment id (png/jpeg/webp/gif). Upload it first via the `attachments` tool (scope: pane or agent).
icon_emojistringOptional single-emoji icon override for this pane.
input_dataobjectOptional seed data for this pane instance, readable in the page as window.pane.inputData (e.g. the diff to review, the options to pick from).
input_schemaobjectInline form only. Optional JSON Schema validating input_data. Needed if input_data references uploaded attachment ids the page must download.
metadataobjectOptional opaque JSON you can attach to the pane for your own bookkeeping (never shown to the human, queryable via run_query).
namestringShort human-readable label for the auto-created template (e.g. 'Deploy approval'). REQUIRED when you pass `html` (inline form); omit when reusing an existing template via `template_id` (it inherits t…
participantsintegerOptional number of distinct human participant URLs to mint (default 1). Each gets its own URL in the returned `urls` array.
preamblestringOptional one/two-line context shown above the UI — 'who is asking, and why'.
record_schemaobjectInline form only. JSON Schema 2020-12 doc with an `x-pane-collections` extension declaring this pane's mutable record collections (todos, comments…). OMIT for an event-only pane.
tagsarrayOptional per-pane filter tags (merged with the template's tags). ≤20 tags, ≤50 chars each; 'favorite'/'favorites' are reserved.
template_idstringReuse an existing named template (id or slug) instead of inline HTML. The template's pinned version supplies the HTML + event/input/record schemas. Mutually exclusive with `html`/`name`/`event_schema…
template_versionintegerWith `template_id`: pin this pane to a specific template version. Defaults to the template head's latest version.
titlestringOptional browser tab title for the human (≤80 chars). Defaults to `name`.
ttl_secondsintegerOptional pane lifetime in seconds. The relay clamps to its max; the returned expires_at is authoritative.

No output schema declared.

No examples provided.

delete_pane ~80

Close/delete a pane (idempotent — an already-closed pane still succeeds). The human's URL stops working. To merely edit a pane keep it alive with update_pane; to recover a soft-deleted pane use the trash tool (action: restore).

NameTypeReqDescription
pane_idstringyesThe pane id to close/delete (idempotent).

No output schema declared.

No examples provided.

delete_record ~102

Soft-delete a row from a pane's record collection. The page sees the deletion live (the row becomes a tombstone in list_records). Pass if_match for an optimistic-locked delete. Returns { deleted: true }.

NameTypeReqDescription
collectionstringyesThe record collection name.
if_matchintegerOptional optimistic-lock version.
pane_idstringyesThe pane id.
record_keystringyesThe key of the record to delete.

No output schema declared.

No examples provided.

delete_record_collection ~153

Drop a WHOLE per-pane record collection at once: every row plus the collection row itself. Use this to reset or remove a collection (todo list, comment thread, board) rather than deleting rows one by one with delete_record. Owner-only and destructive, so it requires confirm:true. Collection names are immutable, so to rename a collection drop the old one and write under the new name. Returns { deleted: true, collection }.

NameTypeReqDescription
collectionstringyesThe record collection to drop in its entirety.
confirmbooleanyesRequired (true) to drop the whole collection. This removes every row plus the collection row itself and cannot be undone.
pane_idstringyesThe pane id.

No output schema declared.

No examples provided.

feedback ~174

Send or list feedback to the relay operator. ONE tool with an `action` enum: create (a bug|feature|note with a message, optional pane_id) | list (the agent's own submissions, newest first, paginated by before).

NameTypeReqDescription
actionstringyesFeedback to the relay operator. create: submit a bug|feature|note with a message (optional pane_id). list: the agent's own submissions, newest first.
beforestringlist cursor from a prior page's next_before.
limitintegerlist page size (default 50, max 100).
messagestringMessage body (required for create).
pane_idstringOptional pane this feedback relates to (create).
typestringFeedback category (required for create).

No output schema declared.

No examples provided.

get_events ~227

Poll a pane's append-only event log for what the human did (form submissions, approvals, picks). This is how you receive the round-trip result — there is no push/streaming in MCP. Poll loop: call with no `since` first; process the returned events; remember next_cursor; call again passing it as `since` to get only newer events. To WAIT for a human who hasn't acted yet, pass wait_seconds (~25) so the relay holds the request open until an event arrives or it times out, then call again with the same cursor. Returns { events, next_cursor }.

NameTypeReqDescription
pane_idstringyesThe pane id to read events from.
sincestringOpaque cursor from a previous get_events call's next_cursor. Omit on the first call to read from the beginning.
wait_secondsintegerOptional long-poll: how long the relay holds the request open waiting for a new event (0–30s). Use ~25 when waiting for a human to act, then call again with the same cursor.

No output schema declared.

No examples provided.

get_pane_state ~75

Fetch a pane's current metadata (status, title, template version, timestamps, expires_at) WITHOUT its event log. Use it to check whether a pane is still open or has expired. To read what the human did, use get_events.

NameTypeReqDescription
pane_idstringyesThe pane id returned by create_pane.

No output schema declared.

No examples provided.

get_record ~87

Fetch a single record row by its key from a pane collection (scans the collection — fine for a one-off lookup, not a hot loop). Returns { record } or an isError record_not_found.

NameTypeReqDescription
collectionstringyesThe record collection name.
pane_idstringyesThe pane id.
record_keystringyesThe key of the record to fetch.

No output schema declared.

No examples provided.

get_skill ~116

Fetch the relay's auto-updating SKILL.md (the full Pane usage guide) — UNAUTHENTICATED, needs no API key. Call this to self-teach the Pane workflow (events vs records, schema grammars, the poll loop) before driving the other tools. Pass version_only:true to get just the relay's skill version string (to check if a cached copy is stale).

NameTypeReqDescription
version_onlybooleanIf true, return only the relay's current skill version string instead of the full SKILL.md markdown.

No output schema declared.

No examples provided.

key ~142

Inspect or revoke the calling agent's API key. ONE tool with an `action` enum: list (key info — agent_id, key_prefix, timestamps) | revoke (self-destruct the agent's OWN key; it stops working immediately and is irreversible — pass confirm:true). The relay scopes keys to the caller, so both act only on your own key.

NameTypeReqDescription
actionstringyesThe calling agent's API key. list: key info (agent_id, key_prefix, timestamps). revoke: self-destruct the agent's OWN key — it stops working immediately and is irreversible (requires confirm:true).
confirmbooleanRequired (true) for revoke.

No output schema declared.

No examples provided.

list_panes ~158

Enumerate YOUR agent's panes (newest first). Use it to find a pane_id you lost, audit what's open, or get a cursor for pagination. No secrets in the response (participant tokens are unrecoverable — mint a fresh URL with the participant tool). Filter by status (open|closed|all) or template_id. Returns { items, next_cursor }.

NameTypeReqDescription
cursorstringOpaque cursor from a previous page's next_cursor.
limitintegerPage size (default 50, max 200).
statusstringFilter by effective status. Default: open.
template_idstringFilter to panes instantiated from a specific named template (head id, not version id).

No output schema declared.

No examples provided.

list_records ~221

List rows in a pane's mutable record collection (todo list, shopping list, kanban board, comment thread). Records are the right primitive when the page shows several mutable items and the CURRENT state matters more than the history. This also doubles as the POLL/watch for records (no streaming in MCP): pass the prior next_since to fetch only newer/changed rows. include_tombstones:true surfaces deletions. Returns { records, next_since, has_more }.

NameTypeReqDescription
collectionstringyesThe record collection name declared in the pane's record schema.
include_tombstonesbooleanInclude soft-deleted rows (deleted_at set) so you can observe deletions. Default false.
limitintegerOptional page size (max 200).
pane_idstringyesThe pane id.
sinceintegerOptional cursor (next_since from a prior call). Also the POLL handle: to watch a collection (no streaming in MCP), call repeatedly passing the previous next_since to fetch only newer/changed rows.

No output schema declared.

No examples provided.

participant ~160

Manage a pane's participant URLs (recovery + leak-containment). ONE tool with an `action` enum: list | new | revoke. Use `new` when you lost the original URL (the plaintext token is returned ONCE — save it). Token URLs are stored hashed and cannot be recovered.

NameTypeReqDescription
actionstringyesManage a pane's participant URLs. list: every participant (active + revoked) — use it to find a participant_id. new: mint a FRESH human URL on an existing pane (the plaintext token is returned ONCE —…
pane_idstringyesThe pane id.
participant_idstringThe participant id to revoke (required for revoke).

No output schema declared.

No examples provided.

run_query ~311

Run read-only SQL over YOUR scoped data (panes, records, events) — the relay scopes every row to panes you own. Use it to summarise activity, find panes/records by content, or build a report. Tables + columns and JSON projection operators are documented on the `sql` parameter. Default output is { columns, rows, truncated, scope, elapsed_ms } (format:json); csv/tsv/table render the rows as text. Capped at 10,000 rows; 10s timeout.

NameTypeReqDescription
formatstringOutput format. Default json (columns+rows+meta). csv/tsv/table render the rows as text.
pane_idstringScope the query to a single pane (resolves a view_conflict when two of your panes share a collection name with different schemas).
sqlstringyesRead-only SQL (SELECT/WITH/SHOW/DESCRIBE/EXPLAIN/PRAGMA) over your scoped data. Tables: panes(id,title,template_id,template_version,status,created_at,expires_at,deleted_at,metadata,input_data), recor…

No output schema declared.

No examples provided.

send_to_pane ~188

Push an event INTO an open pane — update the live UI the human is looking at (progress, a new message, a status change, fresh data). The event type must be declared in the pane's event_schema with 'agent' in its emittedBy. For mutable collections (todos, line items, comment threads) prefer the record tools instead. Returns { event, deduped }.

NameTypeReqDescription
datayesEvent payload — any JSON value valid against the type's payload schema. Use {} or null for a no-payload event.
idempotency_keystringOptional dedup key — a repeat send with the same key is a no-op.
pane_idstringyesThe pane id to push the event into.
typestringyesEvent type. Must be declared in the pane's event_schema with 'agent' in its emittedBy list.

No output schema declared.

No examples provided.

share ~230

Identity sharing on a pane (layered on top of participant tokens). ONE tool with an `action` enum: list (access_mode + grants) | invite (a human by email, role participant|viewer) | set_access (the /p access mode: invite_only|link|public) | revoke (one grant by id). Token (/s/<token>) links are independent of access_mode and keep working.

NameTypeReqDescription
access_modestringAccess mode for set_access.
actionstringyesIdentity sharing on a pane. list: access_mode + all grants. invite: invite a human by email (role participant|viewer). set_access: set the /p access mode (invite_only|link|public). revoke: remove one…
emailstringInvitee email (required for invite).
grant_idstringGrant id to revoke (required for revoke).
pane_idstringyesThe pane id.
rolestringGrant role for invite (default participant).

No output schema declared.

No examples provided.

taste ~165

Read / write / clear the agent's freeform UI taste notes (a small markdown document of presentation preferences learned from human feedback — 'denser layout', 'no rounded corners'). ONE tool with an `action` enum: get | set | clear. Call `get` BEFORE generating a pane so prior feedback shapes the output; `set` does a whole-document replace (not append). Keep entries about UI/presentation only.

NameTypeReqDescription
actionstringyesThe agent's freeform UI taste notes (markdown) — presentation preferences learned from human feedback. get: read them before generating a pane. set: whole-document replace (taste, non-empty). clear:…
tastestringThe full markdown notes (required for set; whole-document replace, not append).

No output schema declared.

No examples provided.

template ~616

Manage reusable, versioned UI templates (author once, instance many times via create_pane's template_id). ONE tool with an `action` enum: create | version | update | search | list | show | get_version | delete | publish | unpublish | search_public | set_icon. Required fields per action are documented on the `action` parameter. A template is HTML + an event schema (+ optional input/record/template-record schemas); a pane is one use of one version of it.

NameTypeReqDescription
actionstringyesWhich template operation to run. create: a new named template (needs name+html). version: append a new immutable version to an existing template (id+html). update: patch head metadata (name/slug/desc…
clearbooleanset_icon: clear both the emoji and image icon.
confirmbooleanRequired (true) for the destructive `delete` action.
descriptionstringProse description (create/update).
event_schemaobjectEvent schema (create/version). Omit for a view-only template.
htmlstringHTML template body / source (required for create + version).
icon_attachment_idstringset_icon: a ready template-scoped raster-image attachment id.
icon_emojistringset_icon: a single-emoji icon.
idstringTemplate id or slug. Required for version/update/show/get_version/delete/publish/unpublish/set_icon.
input_schemaobjectPer-pane input_data JSON Schema (create/version).
limitintegersearch_public page size (1..50).
namestringTemplate display name (required for create).
offsetintegersearch_public offset.
querystringFree-text search (for search / search_public).
record_schemaobjectPer-pane record collections schema (create/version).
scopesarrayverb:noun permission scopes for publish (e.g. ['read:agent']). Empty array clears them.
slugstringStable agent-chosen handle (create/update).
tagsarraySearch keywords (create/update).
template_record_schemaobjectTemplate-level (shared) record collections schema (create/version). Set this before using the template_records tool.
template_typestringSource kind. Default html-inline; html-ref treats html as a URL.
versionintegerVersion number (required for get_version).

No output schema declared.

No examples provided.

template_records ~288

CRUD for TEMPLATE-level record collections — owner-curated content anchored to a template head and visible to every pane derived from any of its versions (vs per-pane records, which are the discrete record tools). ONE tool with an `action` enum: list | get | upsert | update | delete | delete_collection. The template version must declare the collection via template_record_schema (set it with the `template` tool first).

NameTypeReqDescription
actionstringyesOperation on a TEMPLATE-level (owner-curated, shared across every pane of the template) record collection. Same grammar as the per-pane record tools but scoped to a template head. The template versio…
collectionstringyesThe template-level collection name.
confirmbooleanRequired (true) for delete_collection (drops the whole collection).
dataRecord body. Required for upsert/update.
if_matchintegerOptimistic-lock version for update/delete.
include_tombstonesbooleanInclude soft-deleted rows in list.
limitintegerList page size.
record_keystringRecord key. Required for get/update/delete; optional for upsert.
sinceintegerList cursor (and poll handle).
template_idstringyesTemplate id or slug.

No output schema declared.

No examples provided.

trash ~162

Manage soft-deleted panes + templates. ONE tool with an `action` enum: list | restore (pane id) | restore_template (template id|slug) | purge (pane id) | purge_template (template id|slug). purge bypasses the retention window and is permanent. Soft-deleted rows live in trash until the sweeper reclaims them.

NameTypeReqDescription
actionstringyesSoft-delete trash. list: trashed panes + templates. restore/purge: un-trash or hard-delete a pane (id). restore_template/purge_template: same for a template (id|slug). purge bypasses the retention wi…
idstringPane id (restore/purge) or template id|slug (restore_template/purge_template).

No output schema declared.

No examples provided.

update_pane ~348

Edit instance-level fields on a LIVE pane in place (PATCH) without minting a new one — the pane keeps its id, URL, event log, and template pin. Settable: ttl_seconds OR expires_at (mutually exclusive), title, preamble, input_data (replaced wholesale + revalidated), metadata, tags, icon_emoji / icon_attachment_id (or clear_* to drop the override). Pass at least one field. Returns the full new pane state + an updated_fields array. To swap the HTML/schemas, use upgrade_pane instead.

NameTypeReqDescription
clear_icon_attachment_idbooleanClear the attachment icon override (fall back to the template's icon).
clear_icon_emojibooleanClear the emoji override (fall back to the template's icon).
expires_atstringSet expires_at to a specific future ISO-8601 timestamp. Mutually exclusive with ttl_seconds.
icon_attachment_idstringSet the per-pane icon to a ready raster-image attachment id.
icon_emojistringSet the per-pane emoji icon.
input_dataobjectReplace the pane's input_data wholesale (revalidated against the pinned template version's input_schema).
metadataobjectReplace the pane's metadata wholesale.
pane_idstringyesThe pane id to edit.
preamblestringNew preamble (context band above the UI).
tagsarrayReplace the per-pane tags.
titlestringNew tab title.
ttl_secondsintegerReset the pane's lifetime to now + this many seconds. Mutually exclusive with expires_at.

No output schema declared.

No examples provided.

update_record ~139

Update an existing row in a pane's record collection (replaces its data). Pass if_match with the row's current version for an optimistic-locked update — on a version mismatch the relay returns the current row so you can retry. Returns { record }.

NameTypeReqDescription
collectionstringyesThe record collection name.
datayesThe new record body (replaces the row's data).
if_matchintegerOptional optimistic-lock version. On mismatch the update is rejected with the current row in details.current.
pane_idstringyesThe pane id.
record_keystringyesThe key of the record to update.

No output schema declared.

No examples provided.

upgrade_pane ~490

Re-pin a LIVE pane to swap its HTML (design) + event/input/record schemas in place — same URL, no new pane. Two ways: (1) pass `html` to EDIT AN INLINE PANE'S HTML in one call — the relay appends a fresh version with that HTML and re-pins (schemas you omit are inherited from the current version, so to change only the HTML pass only `html`); inline panes only. (2) pass `template_version` to re-pin to a version you already appended with the `template` tool (action: version) — for named/reusable templates. By default a strict schema-compat gate refuses an upgrade that would narrow the schema (returns schema_incompatible_upgrade + details.breaks); pass force:true to apply anyway. Returns { pane_id, template_version, upgraded, breaks, compat }.

NameTypeReqDescription
event_schemaNew event schema for the `html` version. Omit to inherit.
forcebooleanOverride the strict schema-compat gate (compat=force). Without it, an upgrade that would narrow the schema is refused with schema_incompatible_upgrade + details.breaks.
htmlstringINLINE EDIT: the new HTML. The relay appends a fresh template version with this HTML and re-pins the pane to it in one call — editing an INLINE pane's HTML in place (same id/URL), no separate version…
input_schemaobjectNew input schema for the `html` version. Omit to inherit.
pane_idstringyesThe pane id to re-pin.
record_schemaNew record schema for the `html` version. Omit to inherit.
template_record_schemaNew template-level record schema for the `html` version. Omit to inherit.
template_typestringType for the `html` version. Default: html-inline.
template_versionintegerTarget version of the SAME template. Defaults to the template head's latest version. Mutually exclusive with `html`.

No output schema declared.

No examples provided.

upsert_record ~171

Create a row in a pane's record collection, or return the existing row if record_key is already present (deduped:true). Use to add a todo, a line item, a comment, etc. The collection must be declared in the pane's record schema with 'agent' allowed to write. If you're still designing the pane, call get_skill first for the records-vs-events decision and the x-pane-collections schema grammar. Returns { record, deduped }.

NameTypeReqDescription
collectionstringyesThe record collection name.
datayesThe record body — any JSON value valid against the collection schema.
pane_idstringyesThe pane id.
record_keystringOptional stable key. Reusing an existing key returns the existing row (deduped:true).

No output schema declared.

No examples provided.