Install
$ agentstack add mcp-techthos-gadget ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
gadget
Prebuilt, parameterized, interactive HTML widgets for MCP Apps — in Go, out of the box.
gadget lets an MCP server ship CRUD-style UI — data tables, card grids, forms — as fully self-contained HTML template resources: inline CSS, inline JavaScript, zero external files, everything embedded in your single Go binary. Widgets speak the official MCP Apps extension (io.modelcontextprotocol/ui, spec 2026-01-26) and render in any compliant host (Claude, ChatGPT, VS Code, Cursor, Goose, Postman, …).
> Status: pre-release. APIs are not stable yet.
Table and Form widgets rendered by the examples/harness fake host — light and host dark themes.
CardList lays a collection out as a card grid (same filter/sort/pagination/selection as Table); Card renders a single record.
Quickstart
package main
import (
"context"
"net/http"
"github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/techthos/gadget"
"github.com/techthos/gadget/gosdk"
)
func main() {
table := &gadget.Table{
URI: "ui://myapp/users",
Title: "Users",
Columns: []gadget.Column{
gadget.Text("name", "Name"),
gadget.Number("balance", "Balance", "currency:EUR"),
gadget.Badge("status", "Status", map[string]gadget.BadgeVariant{
"active": gadget.BadgeSuccess,
}),
},
Filterable: true,
PageSize: 10,
}
server := mcp.NewServer(&mcp.Implementation{Name: "myapp"}, gosdk.EnableUI(nil))
type in struct{}
type out struct {
Rows []map[string]any `json:"rows"`
}
gosdk.AddWidgetToolFor(server, table,
&mcp.Tool{Name: "list_users", Description: "List users in a table."},
func(context.Context, *mcp.CallToolRequest, in) (*mcp.CallToolResult, out, error) {
rows, _ := gadget.RowsOf(loadUsers())
return nil, out{Rows: rows}, nil
})
h := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server { return server }, nil)
http.ListenAndServe(":8080", h)
}
Ask a connected assistant to "list the users" and it renders an interactive, host-themed table — sortable, filterable, paginated — inside the chat.
Features
- Table: typed columns (text/number/date/badge/link/actions), client-side
sort/filter/pagination, row selection with bulk actions, per-row actions → MCP tool calls, inline destructive-action confirmation, empty/loading states.
- Form: 10 field types, native + inline client validation, submit as a
tool call, server-side field errors mapped inline, prefill for edit flows.
- Host-aware theming:
--gadget-*design tokens defaulting to
host-injected CSS variables (Claude/ChatGPT look automatic), Theme struct overrides, dark mode.
- Locale-aware: numbers/dates formatted via
Intlwith the host's
locale and time zone.
- SDK-agnostic core + adapter for the official
go-sdk; the core works with any Go MCP implementation.
- Self-contained by construction: documents satisfy the spec's default
locked-down CSP; no CDN, no network, no files on disk.
Documentation
- [Widget reference](docs/widgets.md) — Table, Form, actions, data contract
- [Theming](docs/theming.md) — tokens, host variables, dark mode
- [Architecture](docs/architecture.md) — rendering model, runtime, security
Examples
examples/demo— complete MCP server (streamable HTTP or-stdio):
list/edit/save/delete/archive users. Point MCPJam or any MCP Apps host at http://localhost:8080/mcp.
examples/harness— a fake MCP Apps host in one HTML page: renders
widgets in a sandboxed iframe, answers the JSON-RPC handshake, logs all traffic, simulates tool results/errors and theme changes. go run ./examples/harness, open http://localhost:8090.
Development
The TypeScript/CSS runtime lives in ui/ and is bundled with esbuild into internal/assets/dist/ (committed, go:embed-ed — consumers never need Node).
make assets # npm ci + build the runtime bundle
make test # go test ./... + vitest
make verify-dist # fail if committed dist doesn't match ui/ sources
Golden-file tests: go test ./ -update regenerates testdata/golden/.
License
MIT
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Techthos
- Source: Techthos/gadget
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.