コンテンツにスキップ
Subako Docs
日本語
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

Go

Go 用の SDK。

subako-function-sdk-go は、公式の MCP Go SDK で書いた MCP サーバーを、Subako の Function package として実行します。追加した Tool が、それぞれ Agent の呼び出せる Function になります。Go 1.25 以降が必要です。

Package を始める

go run golang.org/x/tools/cmd/gonew@latest \
  github.com/subako-ai/subako-function-template-go example.com/orders

自分の Go module に SDK を追加することもできます。

go get github.com/modelcontextprotocol/go-sdk github.com/subako-ai/subako-function-sdk-go

Tool

package main

import (
	"context"
	"fmt"

	"github.com/modelcontextprotocol/go-sdk/mcp"
	subakofn "github.com/subako-ai/subako-function-sdk-go"
)

type LookupInput struct {
	Order int `json:"order" jsonschema:"the order's number, such as 1042"`
}

type Order struct {
	Status     string `json:"status"`
	TotalCents int    `json:"total_cents"`
}

func lookup(ctx context.Context, req *mcp.CallToolRequest, in LookupInput) (*mcp.CallToolResult, Order, error) {
	if in.Order <= 0 {
		return nil, Order{}, fmt.Errorf("order numbers start at 1")
	}
	return nil, Order{Status: "shipped", TotalCents: 12900}, nil
}

func main() {
	server := mcp.NewServer(&mcp.Implementation{Name: "orders", Version: "0.1.0"}, nil)
	mcp.AddTool(server, &mcp.Tool{Name: "lookup", Description: "Look an order up by its number."}, lookup)
	subakofn.Serve(server)
}
  • Tool 1 つにつき mcp.AddTool を 1 回呼びます。Schema は入力と出力の構造体から推論され、各フィールドの jsonschema タグがそのフィールドの説明になります。
  • error を返すと呼び出しは失敗し、モデルはそのエラーを読みます。
  • server.Run(ctx, &mcp.StdioTransport{}) の代わりに subakofn.Serve(server) を使います。server.Run は WASI 上では止まってしまいます。

Package の名前と説明は、main.go と同じ場所に置く subako-package.json に書きます。

{ "abi": 1, "name": "orders", "description": "Looks orders up." }

ファイル

Volume と Asset は os で読み書きします。たとえば os.ReadFile("/volume/tmp/export.csv") や os.WriteFile("/volume/data/q3.md", data, 0o644) です。

HTTP

wasip1 向けのビルドでは SDK が http.DefaultTransport を置き換えるので、net/http のリクエストは Subako を通って送られます。Grant のネットワークと Credential の設定が適用されます。

resp, err := http.Get("https://api.example.com/orders/1042")

net/http で扱えるのはテキストの本文だけです。Volume のファイルを本文として送る場合や、レスポンスを Volume に保存する場合は subakofn.Do を使います。

res, err := subakofn.Do(subakofn.Request{
	URL:    "https://api.example.com/exports/q3",
	Output: subakofn.ToFile("/volume/tmp/q3.csv"),
})

リクエストの本文は subakofn.TextBody、subakofn.JSONBody、subakofn.FileBody で作ります。subakofn.Get(url) は GET の短縮形です。失敗すると、Kind と Message を持つ *subakofn.HTTPError が返ります。

画像

subakofn.ImageResult を使うと、値と一緒に Volume の画像をモデルに見せられます。

res, err := subakofn.ImageResult(plot, plot.Path)
return res, plot, err

ビルドとテスト

go test ./...                                         # Tool は普通の Go として実行されます
GOOS=wasip1 GOARCH=wasm go build -trimpath -o dist/module.wasm .
cp subako-package.json dist/
subako function create dist

テンプレートの package.sh は、ビルドしたうえで dist/<name>.tar.gz にまとめます。assets/ があれば、それも含めます。bash package.sh で実行してください。

このページは役に立ちましたか?