MCP

// app/mcps/admin_mcp/adminmcp.go
package adminmcp

import (
	"context"

	"golazy.dev/lazymcp"
)

type AdminMCP struct {
	lazymcp.Base
}

func New(ctx context.Context) *AdminMCP {
	return &AdminMCP{Base: lazymcp.NewBase(ctx)}
}

type UserCountParams struct {
	Active bool `json:"active"`
}

type UserCountResult struct {
	Count int `json:"count"`
}

func (m *AdminMCP) UserCountTool(ctx context.Context) lazymcp.ToolSpec {
	return lazymcp.ToolSpec{
		Desc: "Count users.",
		Fn:   m.UserCount,
		UI:   lazymcp.UI("ui://admin/dashboard"),
	}
}

func (m *AdminMCP) UserCount(ctx context.Context, params UserCountParams) (UserCountResult, error) {
	return UserCountResult{Count: 3}, nil
}

func (m *AdminMCP) DashboardApp(ctx context.Context) lazymcp.AppSpec {
	return lazymcp.AppSpec{
		Name:      "dashboard",
		Desc:      "Admin dashboard.",
		View:      "dashboard",
		UseLayout: true,
	}
}
// init/mcp.go
package appinit

import (
	"context"

	"golazy.dev/lazymcp"
	adminmcp "sample_app/app/mcps/admin_mcp"
)

func RegisterMCP(ctx context.Context, scope *lazymcp.Scope) error {
	return scope.Register(adminmcp.New(ctx))
}
// init/app.go
package appinit

import (
	"golazy.dev/lazyapp"
	"sample_app/app"
)

func App() *lazyapp.App {
	return lazyapp.New(lazyapp.Config{
		Name:         "sample_app",
		Drawer:       Draw,
		Public:       app.Public,
		Views:        app.Views,
		Dependencies: Dependencies,
		MCP:          RegisterMCP,
	})
}
{{/* app/views/mcp/admin/dashboard.html.tpl */}}
<section>
  <h1>Admin</h1>
  <p>Rendered as an MCP Apps UI resource.</p>
</section>