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 で実行してください。