qilin

qilin

3.7

Qilin is a Model Context Protocol Framework for Go, designed to simplify the creation of MCP servers with a familiar interface for Go developers.

Qilin is a Go-based framework that facilitates the development of Model Context Protocol (MCP) servers. It is designed to be intuitive for developers familiar with Go's web application frameworks, offering a zero-configuration server setup. Qilin supports streamable HTTP transport, making it versatile for various applications. The framework is currently a work in progress, but it already provides essential features such as tools and resources management, middleware support, and subscription capabilities. Qilin aims to streamline the process of building MCP servers by providing a robust and easy-to-use platform.

Features

  • {'name': 'Zero-config server', 'description': 'Launches an MCP server on STDIN/STDOUT with minimal setup.'}
  • {'name': 'Familiar look and feel', 'description': "Inspired by Go's web application framework, making it easy for developers to adapt."}
  • {'name': 'Streamable HTTP', 'description': 'Supports streamable HTTP transport for efficient data handling.'}

MCP Tools

  • order_beer: Handles beer ordering requests and calculates the total amount.

MCP Resources

  • {'name': 'menu_list', 'description': 'Provides a list of available beers.'}

Usage with Different Platforms

go

go
package main

import (
	"fmt"
	"github.com/miyamo2/qilin"
	"maps"
)

type OrderBeerRequest struct {
	BeerName string `json:"beer_name" jsonschema:"title=Beer Name"`
	Quantity int    `json:"quantity"  jsonschema:"title=Quantity of Beers"`
}

type OrderBeerResponse struct {
	Amount float64 `json:"amount"`
}

var beers = map[string]string{
	"IPA":   "A hoppy beer with a bitter finish.",
	"Stout": "A dark beer with a rich, roasted flavor.",
	"Lager": "A light, crisp beer with a smooth finish.",
}

func main() {
	q := qilin.New("beer hall", qilin.WithVersion("v0.1.0"))

	q.Resource("menu_list",
		"resources://beer_list",
		func(c qilin.ResourceContext) error {
			return c.JSON(maps.Keys(beers))
		})

	q.Tool("order_beer",
		(*OrderBeerRequest)(nil),
		func(c qilin.ToolContext) error {
			var req OrderBeerRequest
			if err := c.Bind(&req); err != nil {
				return err
			}
			_, ok := beers[req.BeerName]
			if !ok {
				return fmt.Errorf("beer %s not found", req.BeerName)
			}
			amount := 8 * req.Quantity // Assume unit cost of all beers is $8.00.
			return c.JSON(OrderBeerResponse{Amount: float64(amount)})
		})
	q.Start() // listen on stdio
}