Skip to main content
Glama

Physical Capability Cloud

render_pcc_dashboard

Read-onlyIdempotent

Compose a live PCC dashboard for a physical-capability task — pass a DashboardManifest (windows + live data bindings + actions) and it renders as an interactive MCP App.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
csdYesThe builtin CSD URI this manifest conforms to.
themeNo
titleYes
api_baseNoGateway base URL. Default https://capability.network.
sectionsYes
descriptionNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
manifestYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • addedInput schema / definitions / Action / properties / arguments
      Added value: +{
      +  "description": "Bounded arguments for the typed operation (host mode only).",
      +  "type": "object"
      +}
    • addedInput schema / definitions / Action / properties / operation_id
      Added value: +{
      +  "description": "R4 PR2 — typed host-mediated operation id. In an MCP-App host view the click routes to the registered pcc.op.<operation_id> tool via tools/call (server-authorized); the raw kind/path is inert in host mode. Standalone rendering ignores this.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / definitions / Binding / properties / pollMs / description
      Previous value: -"Poll cadence in ms (default ~30000)."New value: +"Poll cadence in ms (default ~30000; Zod floors at MIN_POLL_MS=2000 so a shared dashboard can't fast-poll authenticated endpoints)."
    • removedInput schema / definitions / Binding / properties / pollMs / exclusiveMinimum
      Removed value: -0
    • addedInput schema / definitions / Binding / properties / pollMs / minimum
      Added value: +2000
    • changedInput schema / definitions / ListItem / properties / meta / description
      Previous value: -"Dot-path fields for the row's meta line."New value: +"Dot-path fields for the row's meta line (capped at 12 — meta selectors loop per rendered row)."
    • addedInput schema / definitions / ListItem / properties / meta / maxItems
      Added value: +12
    • addedInput schema / definitions / Section / properties / windows / maxItems
      Added value: +24
    • changedInput schema / definitions / Window / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "note"
      -      },
      -      "text": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "format": {
      -        "enum": [
      -          "usd",
      -          "int",
      -          "pct",
      -          "ts"
      -        ]
      -      },
      -      "kind": {
      -        "const": "metric"
      -      },
      -      "label": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "select": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "label",
      -      "binding"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "kind": {
      -        "const": "capability"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "binding"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "item": {
      -        "$ref": "#/definitions/ListItem"
      -      },
      -      "kind": {
      -        "const": "list"
      -      },
      -      "limit": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "binding",
      -      "item"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "form"
      -      },
      -      "schema": {
      -        "description": "A JSON Schema whose properties become form fields.",
      -        "type": "object"
      -      },
      -      "submit": {
      -        "$ref": "#/definitions/Action"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "schema",
      -      "submit"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "kind": {
      -        "const": "run"
      -      },
      -      "latestFrom": {
      -        "type": "string"
      -      },
      -      "statusFrom": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "binding",
      -      "statusFrom",
      -      "latestFrom"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "approve": {
      -        "$ref": "#/definitions/Action"
      -      },
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "deny": {
      -        "$ref": "#/definitions/Action"
      -      },
      -      "kind": {
      -        "const": "approval"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "binding",
      -      "approve"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "binding": {
      -        "$ref": "#/definitions/Binding"
      -      },
      -      "kind": {
      -        "const": "receipt"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "binding"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "composeRef": {
      -        "$ref": "#/definitions/ComposeRequest"
      -      },
      -      "execute": {
      -        "$ref": "#/definitions/Action"
      -      },
      -      "kind": {
      -        "const": "chain"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "composeRef"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "actions": {
      -        "items": {
      -          "$ref": "#/definitions/Action"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "kind": {
      -        "const": "actions"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "actions"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "note"
      +      },
      +      "text": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "format": {
      +        "enum": [
      +          "usd",
      +          "int",
      +          "pct",
      +          "ts"
      +        ]
      +      },
      +      "kind": {
      +        "const": "metric"
      +      },
      +      "label": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "select": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "label",
      +      "binding"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "kind": {
      +        "const": "capability"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "binding"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "item": {
      +        "$ref": "#/definitions/ListItem"
      +      },
      +      "kind": {
      +        "const": "list"
      +      },
      +      "limit": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 200,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "binding",
      +      "item"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "form"
      +      },
      +      "schema": {
      +        "description": "A JSON Schema whose properties become form fields.",
      +        "type": "object"
      +      },
      +      "submit": {
      +        "$ref": "#/definitions/Action"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "schema",
      +      "submit"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "kind": {
      +        "const": "run"
      +      },
      +      "latestFrom": {
      +        "type": "string"
      +      },
      +      "statusFrom": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "binding",
      +      "statusFrom",
      +      "latestFrom"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "approve": {
      +        "$ref": "#/definitions/Action"
      +      },
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "deny": {
      +        "$ref": "#/definitions/Action"
      +      },
      +      "kind": {
      +        "const": "approval"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "binding",
      +      "approve"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "binding": {
      +        "$ref": "#/definitions/Binding"
      +      },
      +      "kind": {
      +        "const": "receipt"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "binding"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "composeRef": {
      +        "$ref": "#/definitions/ComposeRequest"
      +      },
      +      "execute": {
      +        "$ref": "#/definitions/Action"
      +      },
      +      "kind": {
      +        "const": "chain"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "composeRef"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "actions": {
      +        "items": {
      +          "$ref": "#/definitions/Action"
      +        },
      +        "maxItems": 24,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "kind": {
      +        "const": "actions"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "actions"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / description
      Previous value: -"JSON-Schema mirror of @pcc/spec DashboardManifestSchema (packages/spec/src/types/ui-artifact.ts). The small declarative dashboard a person's LLM emits; the pcc-ui kit renders it. Windows are a closed set rendered textContent-only. Actions never carry confirm:\"none\" (a human click is the confirm step). A manifest must NOT contain an API key (pcc_live_/pcc_test_) anywhere — a shared artifact travels with its contents."New value: +"JSON-Schema mirror of @pcc/spec DashboardManifestSchema (packages/spec/src/types/ui-artifact.ts). The small declarative dashboard a person's LLM emits; the pcc-ui kit renders it. Windows are a closed set rendered textContent-only. Actions never carry confirm:\"none\" (a human click is the confirm step). A manifest must NOT contain an API key (pcc_live_/pcc_test_) anywhere — a shared artifact travels with its contents. This mirror now carries the Zod RESOURCE CAPS (sections/windows/actions maxItems 24, list.limit max 200, meta maxItems 12, pollMs minimum 2000) so a generator validating only against this schema does not emit manifests the gateway then rejects. TWO Zod guards are not expressible as JSON-Schema validation and are enforced only by the gateway's Zod (the authoritative gate): the 256KB byte cap (MAX_MANIFEST_BYTES) and the recursive no-credential refine (containsApiKey — rejects a baked pcc key / Bearer / JWT, raw, percent-encoded, or base64). Validate against the Zod DashboardManifestSchema for the full gate."
    • addedInput schema / properties / sections / maxItems
      Added value: +24
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "manifest": {
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "manifest"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds that the output is an interactive MCP App and that the manifest carries windows, live bindings, and actions, but says nothing about persistence, side effects, or whether rendering triggers any server writes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that leads with the verb and resource and then qualifies the manifest shape. Dense but free of filler, though it packs three concepts (compose, manifest parts, MCP App) into one clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description gives a workable high-level framing of a complex nested manifest. What it lacks is invocation context — when this is the right tool among the many dashboard-related siblings — leaving the definition minimally adequate.

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

Parameters3/5

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

Schema description coverage is 33%, below the 50% mark, so the description should compensate and instead only names the manifest's main parts (windows, live bindings, actions). The nested schema is rich in its own definitions, but the top-level fields (csd, theme, title, api_base, sections, description) get no additional meaning from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action on a specific resource: composing a live PCC dashboard and rendering it as an interactive MCP App from a DashboardManifest. It is clear what the tool does, but it never names or distinguishes itself from close siblings like get_dashboard, save_dashboard, update_dashboard, or pcc_generate_ui.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no routing against alternatives. An agent cannot tell from the description whether this persists a dashboard (as save_dashboard might) or merely renders one, nor when to reach for it versus fork_dashboard or get_dashboard.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.