# Pane (npm · @paneui/mcp)

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

- Trust score: 74/100 (medium)
- Change this week: +30
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@paneui/mcp`: 74/100 (this document), [markdown](https://verifymcp.io/servers/aerolalit-pane/paneui-mcp.md), [page](https://verifymcp.io/servers/aerolalit-pane/paneui-mcp)

## Channel facts

- Registry: `npm`
- Package: `@paneui/mcp`
- Version: `0.0.26`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 71/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Cryptographically verified build provenance (signed, bound to aerolalit/paneui).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 48 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add aerolalit-pane -- npx -y @paneui/mcp
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add aerolalit-pane --command npx --arg -y --arg @paneui/mcp
```

### Hermes

```yaml
mcp_servers:
  aerolalit-pane:
    command: "npx"
    args: ["-y", "@paneui/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "aerolalit-pane": {
      "command": "npx",
      "args": [
        "-y",
        "@paneui/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 74, +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.

### 2026-08-02 (score 73, +54)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: aerolalit/paneui
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: MIT

### 2026-07-31 (score 19, −7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 26, +8)

- [security regression] Malware scan: pass → unverified
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100

### 2026-07-28 (score 18, −26)

- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-07-27 (score 44)

First indexed and scored.

## MCP tools (26)

### `create_pane` (~962 tokens)

Create Pane

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 }.

Input parameters:

- `callback` (object): Optional 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_key` (string): Optional natural key (e.g. 'pr-42'). Repeated create_pane calls with the same (template, key) return the SAME pane — makes retries idempotent.
- `event_schema` (object): Inline 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…
- `html` (string): The 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_id` (string): Optional 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_emoji` (string): Optional single-emoji icon override for this pane.
- `input_data` (object): Optional 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_schema` (object): Inline form only. Optional JSON Schema validating input_data. Needed if input_data references uploaded attachment ids the page must download.
- `metadata` (object): Optional opaque JSON you can attach to the pane for your own bookkeeping (never shown to the human, queryable via run_query).
- `name` (string): Short 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…
- `participants` (integer): Optional number of distinct human participant URLs to mint (default 1). Each gets its own URL in the returned `urls` array.
- `preamble` (string): Optional one/two-line context shown above the UI — 'who is asking, and why'.
- `record_schema` (object): Inline 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.
- `tags` (array): Optional per-pane filter tags (merged with the template's tags). ≤20 tags, ≤50 chars each; 'favorite'/'favorites' are reserved.
- `template_id` (string): Reuse 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_version` (integer): With `template_id`: pin this pane to a specific template version. Defaults to the template head's latest version.
- `title` (string): Optional browser tab title for the human (≤80 chars). Defaults to `name`.
- `ttl_seconds` (integer): Optional pane lifetime in seconds. The relay clamps to its max; the returned expires_at is authoritative.

### `get_pane_state` (~75 tokens)

Get Pane State

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.

Input parameters:

- `pane_id` (string, required): The pane id returned by create_pane.

### `get_events` (~227 tokens)

Get Events

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 }.

Input parameters:

- `pane_id` (string, required): The pane id to read events from.
- `since` (string): Opaque cursor from a previous get_events call's next_cursor. Omit on the first call to read from the beginning.
- `wait_seconds` (integer): Optional 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.

### `send_to_pane` (~188 tokens)

Send to Pane

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 }.

Input parameters:

- `data` (required): Event payload — any JSON value valid against the type's payload schema. Use {} or null for a no-payload event.
- `idempotency_key` (string): Optional dedup key — a repeat send with the same key is a no-op.
- `pane_id` (string, required): The pane id to push the event into.
- `type` (string, required): Event type. Must be declared in the pane's event_schema with 'agent' in its emittedBy list.

### `update_pane` (~348 tokens)

Update Pane

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.

Input parameters:

- `clear_icon_attachment_id` (boolean): Clear the attachment icon override (fall back to the template's icon).
- `clear_icon_emoji` (boolean): Clear the emoji override (fall back to the template's icon).
- `expires_at` (string): Set expires_at to a specific future ISO-8601 timestamp. Mutually exclusive with ttl_seconds.
- `icon_attachment_id` (string): Set the per-pane icon to a ready raster-image attachment id.
- `icon_emoji` (string): Set the per-pane emoji icon.
- `input_data` (object): Replace the pane's input_data wholesale (revalidated against the pinned template version's input_schema).
- `metadata` (object): Replace the pane's metadata wholesale.
- `pane_id` (string, required): The pane id to edit.
- `preamble` (string): New preamble (context band above the UI).
- `tags` (array): Replace the per-pane tags.
- `title` (string): New tab title.
- `ttl_seconds` (integer): Reset the pane's lifetime to now + this many seconds. Mutually exclusive with expires_at.

### `upgrade_pane` (~490 tokens)

Upgrade Pane

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 }.

Input parameters:

- `event_schema`: New event schema for the `html` version. Omit to inherit.
- `force` (boolean): Override the strict schema-compat gate (compat=force). Without it, an upgrade that would narrow the schema is refused with schema_incompatible_upgrade + details.breaks.
- `html` (string): INLINE 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_schema` (object): New input schema for the `html` version. Omit to inherit.
- `pane_id` (string, required): The pane id to re-pin.
- `record_schema`: New record schema for the `html` version. Omit to inherit.
- `template_record_schema`: New template-level record schema for the `html` version. Omit to inherit.
- `template_type` (string): Type for the `html` version. Default: html-inline.
- `template_version` (integer): Target version of the SAME template. Defaults to the template head's latest version. Mutually exclusive with `html`.

### `list_panes` (~158 tokens)

List Panes

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 }.

Input parameters:

- `cursor` (string): Opaque cursor from a previous page's next_cursor.
- `limit` (integer): Page size (default 50, max 200).
- `status` (string): Filter by effective status. Default: open.
- `template_id` (string): Filter to panes instantiated from a specific named template (head id, not version id).

### `delete_pane` (~80 tokens)

Delete Pane

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).

Input parameters:

- `pane_id` (string, required): The pane id to close/delete (idempotent).

### `list_records` (~221 tokens)

List Records

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 }.

Input parameters:

- `collection` (string, required): The record collection name declared in the pane's record schema.
- `include_tombstones` (boolean): Include soft-deleted rows (deleted_at set) so you can observe deletions. Default false.
- `limit` (integer): Optional page size (max 200).
- `pane_id` (string, required): The pane id.
- `since` (integer): Optional 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.

### `get_record` (~87 tokens)

Get Record

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.

Input parameters:

- `collection` (string, required): The record collection name.
- `pane_id` (string, required): The pane id.
- `record_key` (string, required): The key of the record to fetch.

### `upsert_record` (~171 tokens)

Upsert Record

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 }.

Input parameters:

- `collection` (string, required): The record collection name.
- `data` (required): The record body — any JSON value valid against the collection schema.
- `pane_id` (string, required): The pane id.
- `record_key` (string): Optional stable key. Reusing an existing key returns the existing row (deduped:true).

### `update_record` (~139 tokens)

Update Record

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 }.

Input parameters:

- `collection` (string, required): The record collection name.
- `data` (required): The new record body (replaces the row's data).
- `if_match` (integer): Optional optimistic-lock version. On mismatch the update is rejected with the current row in details.current.
- `pane_id` (string, required): The pane id.
- `record_key` (string, required): The key of the record to update.

### `delete_record` (~102 tokens)

Delete Record

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 }.

Input parameters:

- `collection` (string, required): The record collection name.
- `if_match` (integer): Optional optimistic-lock version.
- `pane_id` (string, required): The pane id.
- `record_key` (string, required): The key of the record to delete.

### `delete_record_collection` (~153 tokens)

Delete Record Collection

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 }.

Input parameters:

- `collection` (string, required): The record collection to drop in its entirety.
- `confirm` (boolean, required): Required (true) to drop the whole collection. This removes every row plus the collection row itself and cannot be undone.
- `pane_id` (string, required): The pane id.

### `template` (~616 tokens)

Manage Templates

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.

Input parameters:

- `action` (string, required): Which 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…
- `clear` (boolean): set_icon: clear both the emoji and image icon.
- `confirm` (boolean): Required (true) for the destructive `delete` action.
- `description` (string): Prose description (create/update).
- `event_schema` (object): Event schema (create/version). Omit for a view-only template.
- `html` (string): HTML template body / source (required for create + version).
- `icon_attachment_id` (string): set_icon: a ready template-scoped raster-image attachment id.
- `icon_emoji` (string): set_icon: a single-emoji icon.
- `id` (string): Template id or slug. Required for version/update/show/get_version/delete/publish/unpublish/set_icon.
- `input_schema` (object): Per-pane input_data JSON Schema (create/version).
- `limit` (integer): search_public page size (1..50).
- `name` (string): Template display name (required for create).
- `offset` (integer): search_public offset.
- `query` (string): Free-text search (for search / search_public).
- `record_schema` (object): Per-pane record collections schema (create/version).
- `scopes` (array): verb:noun permission scopes for publish (e.g. ['read:agent']). Empty array clears them.
- `slug` (string): Stable agent-chosen handle (create/update).
- `tags` (array): Search keywords (create/update).
- `template_record_schema` (object): Template-level (shared) record collections schema (create/version). Set this before using the template_records tool.
- `template_type` (string): Source kind. Default html-inline; html-ref treats html as a URL.
- `version` (integer): Version number (required for get_version).

### `template_records` (~288 tokens)

Manage Template Records

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).

Input parameters:

- `action` (string, required): Operation 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…
- `collection` (string, required): The template-level collection name.
- `confirm` (boolean): Required (true) for delete_collection (drops the whole collection).
- `data`: Record body. Required for upsert/update.
- `if_match` (integer): Optimistic-lock version for update/delete.
- `include_tombstones` (boolean): Include soft-deleted rows in list.
- `limit` (integer): List page size.
- `record_key` (string): Record key. Required for get/update/delete; optional for upsert.
- `since` (integer): List cursor (and poll handle).
- `template_id` (string, required): Template id or slug.

### `participant` (~160 tokens)

Manage Participants

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.

Input parameters:

- `action` (string, required): Manage 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_id` (string, required): The pane id.
- `participant_id` (string): The participant id to revoke (required for revoke).

### `share` (~230 tokens)

Manage Pane Sharing

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.

Input parameters:

- `access_mode` (string): Access mode for set_access.
- `action` (string, required): Identity 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…
- `email` (string): Invitee email (required for invite).
- `grant_id` (string): Grant id to revoke (required for revoke).
- `pane_id` (string, required): The pane id.
- `role` (string): Grant role for invite (default participant).

### `attachments` (~450 tokens)

Manage Attachments

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.

Input parameters:

- `action` (string, required): Binary 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_id` (string): Attachment id. Required for download/show/delete/mint_token/revoke_token/list_tokens.
- `cursor` (string): list pagination cursor.
- `file_path` (string): upload: ABSOLUTE path to the local file to upload.
- `filename` (string): upload: display filename (defaults to the file's basename).
- `limit` (integer): list page size (1..100).
- `mime` (string): upload: advisory Content-Type (the relay sniffs the bytes regardless).
- `once` (boolean): mint_token: token self-deletes on first GET.
- `out_path` (string): download: ABSOLUTE path to write the bytes to. If omitted, the bytes are returned base64-encoded in the result.
- `pane_id` (string): Required when scope=pane.
- `scope` (string): upload scope (default agent).
- `template_id` (string): Required when scope=template.
- `token_id` (string): revoke_token: the token id to revoke.
- `ttl_seconds` (integer): mint_token: per-token TTL (clamped by scope default).

### `taste` (~165 tokens)

Manage UI Taste Notes

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.

Input parameters:

- `action` (string, required): The 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:…
- `taste` (string): The full markdown notes (required for set; whole-document replace, not append).

### `key` (~142 tokens)

Manage API Key

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.

Input parameters:

- `action` (string, required): The 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).
- `confirm` (boolean): Required (true) for revoke.

### `trash` (~162 tokens)

Manage Trash

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.

Input parameters:

- `action` (string, required): Soft-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…
- `id` (string): Pane id (restore/purge) or template id|slug (restore_template/purge_template).

### `feedback` (~174 tokens)

Manage Feedback

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).

Input parameters:

- `action` (string, required): Feedback to the relay operator. create: submit a bug|feature|note with a message (optional pane_id). list: the agent's own submissions, newest first.
- `before` (string): list cursor from a prior page's next_before.
- `limit` (integer): list page size (default 50, max 100).
- `message` (string): Message body (required for create).
- `pane_id` (string): Optional pane this feedback relates to (create).
- `type` (string): Feedback category (required for create).

### `agent` (~199 tokens)

Manage Agent Identity

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).

Input parameters:

- `action` (string, required): Agent 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…
- `code` (string): The one-shot claim code (required for claim).

### `run_query` (~311 tokens)

Run SQL Query

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.

Input parameters:

- `format` (string): Output format. Default json (columns+rows+meta). csv/tsv/table render the rows as text.
- `pane_id` (string): Scope the query to a single pane (resolves a view_conflict when two of your panes share a collection name with different schemas).
- `sql` (string, required): Read-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…

### `get_skill` (~116 tokens)

Get Skill Guide

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).

Input parameters:

- `version_only` (boolean): If true, return only the relay's current skill version string instead of the full SKILL.md markdown.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/aerolalit-pane/paneui-mcp#diagnostics

## Score history

- 2026-08-03: 74
- 2026-08-02: 73
- 2026-08-01: 19
- 2026-07-31: 19
- 2026-07-30: 26
- 2026-07-28: 18
- 2026-07-27: 44

## Links

- npm package: https://www.npmjs.com/package/@paneui/mcp
- Socket report: https://socket.dev/npm/package/@paneui/mcp
- Changelog RSS feed: https://verifymcp.io/servers/aerolalit-pane/paneui-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/aerolalit-pane/paneui-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/aerolalit-pane/paneui-mcp
