Skip to content

Examples

Register a local tool + expose MCP server

type localRegistry struct {
  handlers map[string]run.LocalHandler
}

func newLocalRegistry() *localRegistry {
  return &localRegistry{handlers: make(map[string]run.LocalHandler)}
}

func (r *localRegistry) Get(name string) (run.LocalHandler, bool) {
  h, ok := r.handlers[name]
  return h, ok
}

func (r *localRegistry) Register(name string, h run.LocalHandler) {
  r.handlers[name] = h
}

idx := index.NewInMemoryIndex()

local := newLocalRegistry()
local.Register("ping", func(ctx context.Context, args map[string]any) (any, error) {
  return map[string]any{"ok": true}, nil
})

_ = idx.RegisterTool(model.Tool{
  Namespace: "local",
  Tool: mcp.Tool{
    Name:        "ping",
    Description: "Simple health check",
    InputSchema: map[string]any{"type": "object"},
  },
}, model.ToolBackend{
  Kind:  model.BackendKindLocal,
  Local: &model.LocalBackend{Name: "ping"},
})

runner := run.NewRunner(run.WithIndex(idx), run.WithLocalRegistry(local))

cfg := adapters.NewConfig(idx, tooldoc.NewInMemoryStore(tooldoc.StoreOptions{Index: idx}), runner, nil)
server, _ := server.New(cfg)
_ = server.Run(context.Background(), &mcp.StdioTransport{})

Tool search and execution

summaries, _ := idx.Search("ping", 3)

res, _ := runner.Run(ctx, summaries[0].ID, map[string]any{})
fmt.Println(res.Structured)

Toolsets and skills config

See examples/skills.yaml for a full configuration that defines toolsets, skills, and default guardrails.