Are you the author? Sign in to claim
Prebuilt, interactive HTML widgets for MCP Apps in Go — data tables and forms, self-contained in a single binary, host-t
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.
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.
--gadget-* design tokens defaulting to
host-injected CSS variables (Claude/ChatGPT look automatic), Theme struct
overrides, dark mode.Intl with the host's
locale and time zone.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.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/.
MIT
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows