---
title: Go
description: Go 用の SDK。
---

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

## Package を始める

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

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

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

## Tool

```go main.go
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` に書きます。

```json subako-package.json
{ "abi": 1, "name": "orders", "description": "Looks orders up." }
```

## ファイル

[Volume と Asset](/ja/functions/runtime#ファイルシステム) は `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 の設定が適用されます。

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

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

```go
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 の画像をモデルに見せられます。

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

## ビルドとテスト

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