ork-assess
Assess a code change, design, architecture, workflow, or competing options against explicit criteria and evidence. Use when a…
Renders MCP tool JSON results as dashboards via @json-render/mcp (stat grids, tables, badges). Use when a result reads better visually. Not for building the server.
Claude Code
$ npx -y skills add yonatangross/orchestkit --skill mcp-visual-output --agent claude-code
Codex
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a codex -y
Cursor
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a cursor -y
Gemini CLI
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a gemini-cli -y
GitHub Copilot
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a github-copilot -y
OpenCode
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a opencode -y
Windsurf
$ npx skills add yonatangross/orchestkit --skill mcp-visual-output -a windsurf -y
name: mcp-visual-output compatibility: "Claude Code 2.1.277+" description: "Renders MCP tool JSON results as dashboards via @json-render/mcp (stat grids, tables, badges). Use when a result reads better visually. Not for building the server." user-invocable: false disable-model-invocation: false context: inherit metadata: category: mcp upstream-package: "@json-render/mcp" upstream-version-tested: "0.21.3" version: "1.1.0" author: "OrchestKit" complexity: "medium" tags: "mcp, json-render, visual-output, dashboard, iframe, sandbox, interactive-ui, genui"
Upstream version reference: `@json-render/mcp` 0.21.3 (2026-10-24).
Upgrade plain MCP tool responses to interactive dashboards rendered inside AI conversations. Built on `@json-render/mcp`, which bridges the json-render spec system with MCP's tool/resource model -- the AI generates a typed JSON spec, and a sandboxed iframe renders it as an interactive UI.
> **Building an MCP server from scratch?** Use `ork-extras:mcp-patterns` for server setup, transport, and security. This skill focuses on the **visual output layer** after your server is running. > > **Need the full component catalog?** See `ork:json-render-catalog` for all available components, props, and composition patterns.
What are you doing? | +-- Setting up visual output for the first time | +-- New MCP server -----------> rules/mcp-app-setup.md | +-- Existing MCP server ------> rules/mcp-app-setup.md (registerJsonRenderTool section) | +-- Configuring security / sandbox | +-- CSP declarations ----------> rules/sandbox-csp.md | +-- Iframe permissions --------> rules/sandbox-csp.md | +-- Rendering strategy | +-- Progressive streaming -----> rules/streaming-output.md | +-- Dashboard layouts ----------> rules/dashboard-patterns.md | +-- API reference | +-- Server-side API -----------> references/mcp-integration.md | +-- Component recipes ----------> references/component-recipes.md
| Category | Rule | Impact | Key Pattern | |----------|------|--------|-------------| | **Setup** | `mcp-app-setup.md` | HIGH | createMcpApp() and registerJsonRenderTool() | | **Security** | `sandbox-csp.md` | HIGH | CSP declarations, iframe sandboxing | | **Rendering** | `streaming-output.md` | MEDIUM | Progressive rendering via JSON Patch | | **Patterns** | `dashboard-patterns.md` | MEDIUM | Stat grids, status badges, data tables |
**Total: 4 rules across 3 categories**
1. **Define a catalog** -- typed component schemas using `defineCatalog()` + Zod 2. **Register with MCP** -- `createMcpApp()` for new servers or `registerJsonRenderTool()` for existing ones 3. **AI generates specs** -- the model produces a JSON spec conforming to the catalog 4. **Iframe renders it** -- a bundled React app inside a sandboxed iframe renders the spec with `useJsonRenderApp()` + `<Renderer />`
The AI never writes HTML or CSS. It produces a structured JSON spec that references catalog components by type. The iframe app renders those components using a pre-built registry.
import { createMcpApp } from '@json-render/mcp'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { buildAppHtml } from '@json-render/mcp/app'
import { catalog } from './catalog'
// Generate the iframe HTML from the bundled JS/CSS (docs-prescribed generator).
const bundledHtml = buildAppHtml({ entry: './app.tsx' })
// 1. Create the MCP app (async; returns an McpServer, no .start()/.close()).
// name + version are required; tool config nests under `tool`
// (default tool name is 'render-ui'). There is no top-level `csp`.
const server = await createMcpApp({
name: 'my-app',
version: '1.0.0',
catalog, // component schemas the AI can use
html: bundledHtml, // pre-built iframe app (single HTML file)
tool: {
name: 'render-dashboard',
description: 'Render an interactive dashboard from a json-render spec',
},
})
// 2. Connect a transport -- stdio, Streamable HTTP, or any MCP transport
await server.connect(new StdioServerTransport())import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { registerJsonRenderTool, registerJsonRenderResource } from '@json-render/mcp'
import { buildAppHtml } from '@json-render/mcp/app'
import { catalog } from './catalog'
const server = new McpServer({ name: 'my-server', version: '1.0.0' })
// Generate the iframe HTML from the bundled JS/CSS (docs-prescribed generator).
const bundledHtml = buildAppHtml({ entry: './app.tsx' })
const resourceUri = 'ui://my-server/dashboard'
// Register the render tool (lets the model return specs).
// name, title, description, and resourceUri are all required.
registerJsonRenderTool(server, {
catalog,
name: 'render-dashboard',
title: 'Render Dashboard',
description: 'Render an interactive dashboard from a json-render spec',
resourceUri,
})
// Serve the bundled HTML iframe app as a resource (new in 0.15).
// resourceUri must match the tool's resourceUri.
registerJsonRenderResource(server, { resourceUri, html: bundledHtml })`registerJsonRenderResource()` was added in 0.15 to separate **tool registration** from **UI resource serving** — useful when the host caches the bundled HTML (clients: Claude, ChatGPT, Cursor, VS Code Copilot, Goose, Postman). Transports: stdio **and** Streamable HTTP (Express) both supported. This skill is verified against `@json-render/mcp` **0.20.0**, which shipped zero code change: every published file is byte-identical to 0.19.0 apart from the version and its pinned `@json-render/core` dependency. New capability in that release therefore belongs to core and react, not to this package. What reaches an MCP-rendered iframe indirectly is named slots and nested repeats, plus a fix so named `onSuccess`/
The Complete AI Development Toolkit for Claude Code. 115 skills, 36 agents, 163 hooks. Install `ork` for stable (v10.x).
Assess a code change, design, architecture, workflow, or competing options against explicit criteria and evidence. Use when a…
Compare plausible implementation, architecture, product, or operational approaches before committing to one. Use when a request…
Map an unfamiliar codebase, feature, architecture, data flow, or operational path with file-backed evidence. Use when a request…
Render an answer inline as compact ASCII or box-drawing art with semantic status icons. Use for status, inventories, budgets,…
Make an approved, scoped change and prove the affected behavior. Use when a request asks to implement, build, add, or land a…
Review a pull request or branch for correctness, regressions, security, operational risk, and missing evidence. Use when a…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.