{"id":48489221,"url":"https://github.com/danfking/burnish","last_synced_at":"2026-04-20T03:00:51.469Z","repository":{"id":347676338,"uuid":"1194871187","full_name":"danfking/burnish","owner":"danfking","description":"Swagger UI for MCP servers — explore, test, and visualize any Model Context Protocol server with rich components (charts, tables, pipelines). No LLM required.","archived":false,"fork":false,"pushed_at":"2026-04-15T00:19:15.000Z","size":4666,"stargazers_count":0,"open_issues_count":17,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-15T00:20:04.322Z","etag":null,"topics":["api-explorer","cli","dashboard","developer-tools","explorer","json-schema","lit","mcp","mcp-server","model-context-protocol","no-code","open-source","swagger","typescript","ui","visualization","web-components"],"latest_commit_sha":null,"homepage":"https://burnish-demo.fly.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danfking.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-28T23:18:53.000Z","updated_at":"2026-04-15T00:03:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/danfking/burnish","commit_stats":null,"previous_names":["danfking/mcpui","danfking/burnish"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/danfking/burnish","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danfking%2Fburnish","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danfking%2Fburnish/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danfking%2Fburnish/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danfking%2Fburnish/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danfking","download_url":"https://codeload.github.com/danfking/burnish/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danfking%2Fburnish/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32031070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-explorer","cli","dashboard","developer-tools","explorer","json-schema","lit","mcp","mcp-server","model-context-protocol","no-code","open-source","swagger","typescript","ui","visualization","web-components"],"created_at":"2026-04-07T11:02:25.146Z","updated_at":"2026-04-20T03:00:51.463Z","avatar_url":"https://github.com/danfking.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/assets/hero-demo.gif\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"docs/assets/hero-demo.gif\"\u003e\n    \u003cimg src=\"docs/assets/hero-demo.gif\" alt=\"Burnish Explorer: pick an MCP server, see every tool, fill a form, get a rendered answer — no LLM.\" width=\"820\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eBurnish\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cstrong\u003eSwagger UI for MCP servers.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eExplore any MCP server in your browser. No LLM, no API key, no config.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/burnish\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/burnish.svg?color=8B3A3A\u0026label=npm\" alt=\"npm version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.gnu.org/licenses/agpl-3.0\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-AGPL--3.0-8B3A3A.svg\" alt=\"License: AGPL-3.0\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/danfking/burnish/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/danfking/burnish/ci.yml?branch=main\u0026label=CI\" alt=\"CI status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/danfking/burnish\"\u003e\u003cimg src=\"https://img.shields.io/badge/Explore-with%20Burnish-8B3A3A\" alt=\"Explore with Burnish\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Quickstart\n\n```bash\nnpx burnish -- npx -y @burnishdev/example-server\n```\n\nThat's it. Burnish spawns the example MCP server, reads its tool list, opens your browser, and renders every tool as an interactive form. The example server ships with a dozen tools — creating bug reports, listing team members, searching records — so you can click through, fill in forms, and see results rendered as cards, tables, and charts without writing a line of your own MCP code.\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/assets/quickstart-screenshot-dark.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"docs/assets/quickstart-screenshot-light.png\"\u003e\n    \u003cimg src=\"docs/assets/quickstart-screenshot-light.png\" alt=\"Burnish Explorer showing the example server's list-projects tool rendered as cards\" width=\"820\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\nWant to try it against a different server? Point `burnish` at any stdio or SSE MCP server — see [What you can point it at](#what-you-can-point-it-at) below.\n\nTry the hosted demo: **[burnish-demo.fly.dev](https://burnish-demo.fly.dev)**\n\n## Why Burnish?\n\n- **Zero LLM.** No OpenAI key, no Anthropic key, no inference cost. Ever. Explorer mode is 100% deterministic — schemas in, forms out, results rendered.\n- **Zero config.** Point `npx burnish` at an MCP server command and it runs. No JSON files, no accounts, no Docker.\n- **Zero data leaving your machine.** The CLI runs locally and talks only to the MCP server you pointed it at. No analytics pixels, no telemetry by default.\n\n## Compared to the alternatives\n\n| | Burnish | MCP Inspector | Composio / Rube | Smithery | n8n |\n|---|:---:|:---:|:---:|:---:|:---:|\n| **Works without LLM** | ✅ | ✅ | ❌ | ➖ | ❌ |\n| **Rich visualization** | ✅ Cards, tables, charts | ❌ Raw JSON | ➖ Limited | ➖ Registry only | ➖ Node output |\n| **Any MCP server** | ✅ | ✅ | ➖ 500 pre-wrapped | ➖ Browse only | ➖ Custom nodes |\n| **Auto-generated forms** | ✅ From schema | ❌ Manual JSON | ➖ Pre-built only | ❌ | ➖ Node config UI |\n| **Local / private** | ✅ Fully | ✅ | ❌ Cloud | ❌ Cloud | ➖ Self-host (heavy) |\n| **Zero setup** | ✅ `npx burnish` | ✅ `npx` | ❌ Account required | ➖ Browse only | ❌ Docker required |\n| **Composable** | ✅ Any server combo | ❌ Single server | ❌ Locked ecosystem | ➖ | ➖ Workflow builder |\n\n✅ Full support · ➖ Partial / limited · ❌ Not supported\n\n## What you can point it at\n\n```bash\n# The Burnish example server — richest default demo\nnpx burnish -- npx -y @burnishdev/example-server\n\n# Any published stdio MCP server\nnpx burnish -- npx -y @modelcontextprotocol/server-filesystem /tmp\n\n# GitHub (needs a PAT)\nGITHUB_PERSONAL_ACCESS_TOKEN=ghp_... \\\n  npx burnish -- npx -y @modelcontextprotocol/server-github\n\n# An SSE / HTTP MCP server\nnpx burnish --sse https://your-mcp-server.example.com/sse\n\n# A multi-server config file\nnpx burnish --config ./mcp-servers.json\n```\n\nAll configured servers connect at startup. Their tools are available immediately — discoverable, documented, and executable from the browser.\n\n## For MCP server owners\n\nLet your users explore your server without cloning anything. Drop this into your README:\n\n````markdown\n[![Explore with Burnish](https://img.shields.io/badge/Explore-with%20Burnish-8B3A3A)](https://github.com/danfking/burnish)\n\n```bash\nnpx burnish -- npx @your-org/your-mcp-server\n```\n````\n\nWant your tool results to render as cards, tables, and charts instead of raw JSON? See the [Output Format Guide](docs/OUTPUT-FORMAT.md).\n\n## Links\n\n- **Hosted demo** — [burnish-demo.fly.dev](https://burnish-demo.fly.dev)\n- **Discussions** — [github.com/danfking/burnish/discussions](https://github.com/danfking/burnish/discussions)\n- **Issues** — [github.com/danfking/burnish/issues](https://github.com/danfking/burnish/issues)\n- **Registries** — Smithery, Glama, mcp.so (tracked in [#383](https://github.com/danfking/burnish/issues/383))\n\n## Features\n\nConnect. Browse. Execute. Everything is driven by the server's tool schemas.\n\n- **Instant tool discovery** — every tool listed with its description and input schema\n- **Auto-generated forms** — JSON Schema in, interactive form out\n- **Rich results** — responses rendered as cards, tables, charts, stat bars, not raw JSON\n- **Fully private** — runs locally, no external calls, no telemetry by default\n- **Zero config** — `npx burnish` and you're running\n- **Drill-down navigation** — collapsible sections and session persistence\n- **Framework-agnostic** — standard web components, no React/Vue/Angular lock-in\n- **Themeable** — `--burnish-*` CSS custom properties\n- **No build step** — import components from CDN as ES modules\n\n## Component reference\n\n10 Lit 3 web components, each driven by JSON attributes. Every example below is live in the [hosted demo](https://burnish-demo.fly.dev) — click \"Try it\" to open the tool directly.\n\n| Component | Preview | Key Attributes | Purpose | Live example |\n|-----------|---------|----------------|---------|--------------|\n| `\u003cburnish-card\u003e` | ![card](docs/assets/components/card.png) | `title`, `status`, `body`, `meta` (JSON), `item-id` | Individual items with drill-down | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-project) |\n| `\u003cburnish-stat-bar\u003e` | ![stat-bar](docs/assets/components/stat-bar.png) | `items` (JSON: `[{label, value, color?}]`) | Summary metrics / filter pills | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=list-projects) |\n| `\u003cburnish-table\u003e` | ![table](docs/assets/components/table.png) | `title`, `columns` (JSON), `rows` (JSON), `status-field` | Tabular data with status coloring | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=list-projects) |\n| `\u003cburnish-chart\u003e` | ![chart](docs/assets/components/chart.png) | `type` (line/bar/doughnut), `config` (JSON) | Chart.js visualizations | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-revenue-chart) |\n| `\u003cburnish-section\u003e` | ![section](docs/assets/components/section.png) | `label`, `count`, `status`, `collapsed` | Collapsible grouping container | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-dashboard-overview) |\n| `\u003cburnish-metric\u003e` | ![metric](docs/assets/components/metric.png) | `label`, `value`, `unit`, `trend` (up/down/flat) | Single KPI display | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-team-member) |\n| `\u003cburnish-message\u003e` | ![message](docs/assets/components/message.png) | `role` (user/assistant), `content`, `streaming` | Chat bubbles | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-status-report) |\n| `\u003cburnish-form\u003e` | ![form](docs/assets/components/form.png) | `title`, `tool-id`, `fields` (JSON) | User input / tool execution | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=create-bug-report) |\n| `\u003cburnish-actions\u003e` | ![actions](docs/assets/components/actions.png) | `actions` (JSON: `[{label, action, prompt, icon?}]`) | Contextual next-step buttons | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-suggested-actions) |\n| `\u003cburnish-pipeline\u003e` | ![pipeline](docs/assets/components/pipeline.png) | `steps` (JSON: `[{server, tool, status}]`) | Real-time tool chain visualization | [Try it](https://burnish-demo.fly.dev?server=showcase\u0026tool=get-pipeline-status) |\n\n**Status values:** `success`, `warning`, `error`, `muted`, `info` — mapped to semantic colors via CSS custom properties.\n\n**Action types:** `read` (auto-invoke, safe) and `write` (shows form, requires user confirmation).\n\n## SDK integration\n\n### Middleware\n\nAdd Burnish Explorer to your MCP server with one line:\n\n```typescript\nimport { withBurnishUI } from \"burnish/middleware\";\nawait withBurnishUI(server, { port: 3001 });\n```\n\n### Schema export\n\n```bash\nnpx burnish export -- npx @your-org/your-server \u003e schema.json\n```\n\n## Use in your own project\n\n### CDN (no build step)\n\n```html\n\u003cscript type=\"module\"\n  src=\"https://esm.sh/@burnishdev/components@0.4.1\"\u003e\u003c/script\u003e\n\u003clink rel=\"stylesheet\"\n  href=\"https://cdn.jsdelivr.net/npm/@burnishdev/components@0.4.1/src/tokens.css\" /\u003e\n\n\u003cburnish-card\n  title=\"API Gateway\"\n  status=\"success\"\n  body=\"All systems operational\"\n  meta='[{\"label\":\"Uptime\",\"value\":\"99.9%\"},{\"label\":\"Latency\",\"value\":\"42ms\"}]'\n  item-id=\"api-gw-1\"\u003e\n\u003c/burnish-card\u003e\n```\n\n### npm\n\n```bash\nnpm install @burnishdev/components\n```\n\n```javascript\nimport '@burnishdev/components';\n\n// Components auto-register with burnish-* prefix.\n// Custom prefix:\nimport { BurnishCard } from '@burnishdev/components';\ncustomElements.define('my-card', class extends BurnishCard {});\n```\n\n### Renderer\n\n```bash\nnpm install @burnishdev/renderer\n```\n\n```javascript\nimport { findStreamElements, appendStreamElement } from '@burnishdev/renderer';\n\nconst elements = findStreamElements(chunk);\nfor (const el of elements) {\n  appendStreamElement(container, stack, el, safeAttrs, sanitize);\n}\n```\n\n## Configuration\n\n### MCP servers\n\nConfigure in `apps/demo/mcp-servers.json` when running from source, or pass `--config` to the CLI:\n\n```json\n{\n  \"mcpServers\": {\n    \"example\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@burnishdev/example-server\"]\n    },\n    \"filesystem\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/path/to/dir\"]\n    },\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"],\n      \"env\": {\n        \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"${GITHUB_PERSONAL_ACCESS_TOKEN}\"\n      }\n    }\n  }\n}\n```\n\nAll configured servers connect at startup. Their tools are available immediately.\n\n## Development\n\n```bash\ngit clone https://github.com/danfking/burnish.git\ncd burnish\npnpm install          # Install all dependencies\npnpm build            # Build all packages\npnpm dev              # Start the demo\npnpm test             # Run Playwright tests\npnpm clean            # Clean all build artifacts\n```\n\n```\nburnish/\n├── packages/\n│   ├── components/       @burnishdev/components — 10 Lit web components\n│   ├── renderer/         @burnishdev/renderer — streaming parser + sanitizer\n│   ├── app/              @burnishdev/app — drill-down logic + stream orchestration\n│   ├── server/           @burnishdev/server — MCP hub + guards + intent resolver\n│   ├── example-server/   @burnishdev/example-server — showcase MCP server (34 tools)\n│   └── cli/              burnish CLI — npx burnish launcher + middleware\n├── apps/\n│   └── demo/\n│       ├── server/       Hono API\n│       └── public/       SPA shell (ES modules, no framework)\n└── package.json          pnpm workspace root\n```\n\n### Prerequisites\n\n- Node.js 20+\n- [pnpm](https://pnpm.io/) 9+\n\n## How it works\n\n```\n    ┌──────────────────────────────────┐\n    │        MCP Servers                │\n    │  (filesystem, GitHub, DB, ...)    │\n    └──────────────┬───────────────────┘\n                   │ tool calls / results\n                   ▼\n    ┌──────────────────────────┐\n    │  Schema-Driven UI        │\n    │                          │\n    │  • List tools             │\n    │  • Generate forms         │\n    │  • Map results → comps    │\n    └──────────┬───────────────┘\n               │\n               ▼\n    ┌──────────────────────────┐\n    │  Streaming Renderer      │\n    │                          │\n    │  • Parse tags on arrival  │\n    │  • Sanitize (DOMPurify)  │\n    │  • Append to DOM         │\n    └──────────┬───────────────┘\n               │\n               ▼\n    ┌──────────────────────────┐\n    │  Web Components (Lit 3)  │\n    │                          │\n    │  • Shadow DOM isolation  │\n    │  • JSON attribute parsing│\n    │  • Event-driven drill-   │\n    │    down navigation       │\n    └──────────────────────────┘\n```\n\nBurnish reads the MCP server's tool list, generates forms from JSON Schema, and maps results directly to components — no LLM in the loop. Everything runs locally.\n\n## Coming soon: Navigator\n\nNavigator is the planned LLM-powered natural-language layer over Explorer mode — ask a question and Burnish picks the right tools across your connected servers, rendering the answer with the same components you see today. Explorer mode (what you use now) stays free, local, and zero-LLM.\n\n[Join the waitlist →](https://github.com/danfking/burnish/discussions/389)\n\n## Privacy \u0026 Telemetry\n\nBurnish collects **opt-in**, anonymous telemetry to measure real adoption (see [issue #382](https://github.com/danfking/burnish/issues/382)). It is **off by default**. On the first interactive run of the CLI you'll see a prompt asking whether to enable it — pressing Enter or anything other than `y` keeps it off.\n\n**What we send (only if you opt in):**\n\n- `v` — burnish CLI version\n- `os` — OS family: `darwin`, `linux`, `win32`, or `other`\n- `node` — Node.js major version\n- `bucket` — coarse invocation-count bucket: `1`, `2-5`, `6-20`, or `21+`\n- `id` — a random install ID (UUID) generated once on first opt-in\n- `schema_version` — payload schema version (currently `\"1\"`)\n\n**What we never send:** server URLs, tool names, schemas, arguments, file paths, hostnames, usernames, IP addresses we can see beyond the TCP connection, or any content from your MCP servers. There is no per-tool or per-schema tracking.\n\n**How to opt out at any time:**\n\n1. Set the environment variable `BURNISH_TELEMETRY=0` (also accepts `false`, `off`, `no`). This overrides any stored choice.\n2. Or delete / edit the stored choice file:\n   - macOS / Linux: `~/.config/burnish/telemetry.json` (honors `$XDG_CONFIG_HOME`)\n   - Windows: `%APPDATA%\\burnish\\telemetry.json`\n\nTelemetry is a single fire-and-forget HTTPS POST to `https://burnish-demo.fly.dev/telemetry/v1/ping` with a short timeout. If the endpoint is unreachable, the CLI behaves identically — nothing is retried or queued. Telemetry is skipped entirely in non-interactive and CI environments when no choice has been stored.\n\n## License\n\n[AGPL-3.0](LICENSE) — Daniel King ([@danfking](https://github.com/danfking))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanfking%2Fburnish","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanfking%2Fburnish","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanfking%2Fburnish/lists"}