MCP Go SDK について
MCP Go SDK は Go で実装された Model Context Protocol のライブラリで、クライアントとサーバーの両方の機能を提供します。Go で MCP サーバーやクライアントを開発したい開発者に向けたプロジェクトです。MIT ライセンスで公開されています。
主な機能
- 01MCP 基本プロトコルの実装
- 02クライアントとサーバーの開発に対応
- 03リソース、プロンプト、ツールの公開
- 04stdio トランスポートへの対応
活用シーン
- 01ローカルファイルをリソースとして公開する Go 製 MCP サーバーの作成
- 02任意の MCP サーバーに接続する Go 製クライアントの開発
MCP 対応
この SDK は MCP プロトコルそのものを実装します。構築したサーバーはリソース、プロンプト、ツールを MCP クライアントに公開し、クライアントは任意の MCP サーバーに接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Go SDK
LLM サーフェスと連携するためのクライアント機能とサーバー機能を備えた、Model Context Protocol(MCP)の Go 実装です。
概要
Model Context Protocol を使うと、アプリケーションは LLM との実際のやり取りとコンテキストの提供を切り分け、標準化された方法で LLM にコンテキストを提供できます。この Go SDK は MCP 仕様全体を実装しており、次のことを簡単に行えます。
- 任意の MCP サーバーに接続できる MCP クライアントを構築する
- リソース、プロンプト、ツールを公開する MCP サーバーを作成する
- stdio や SSE などの標準トランスポートを使用する(近日対応予定)
- MCP プロトコルのすべてのメッセージとライフサイクルイベントを処理する
小さな例
実際にどのようなものか気になりませんか?以下は、io.FS の内容をリソースとして公開するサーバーの例です。
package main
import (
"context"
"flag"
"io/fs"
"log"
"mime"
"os"
"path/filepath"
"strings"
"github.com/riza-io/mcp-go"
)
type FSServer struct {
fs fs.FS
mcp.UnimplementedServer
}
func (s *FSServer) Initialize(ctx context.Context, req *mcp.Request[mcp.InitializeRequest]) (*mcp.Response[mcp.InitializeResponse], error) {
return mcp.NewResponse(&mcp.InitializeResponse{
ProtocolVersion: req.Params.ProtocolVersion,
Capabilities: mcp.ServerCapabilities{
Resources: &mcp.Resources{},
},
}), nil
}
func (s *FSServer) ListResources(ctx context.Context, req *mcp.Request[mcp.ListResourcesRequest]) (*mcp.Response[mcp.ListResourcesResponse], error) {
var resources []mcp.Resource
fs.WalkDir(s.fs, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
resources = append(resources, mcp.Resource{
URI: "file://" + path,
Name: path,
MimeType: mime.TypeByExtension(filepath.Ext(path)),
})
return nil
})
return mcp.NewResponse(&mcp.ListResourcesResponse{
Resources: resources,
}), nil
}
func (s *FSServer) ReadResource(ctx context.Context, req *mcp.Request[mcp.ReadResourceRequest]) (*mcp.Response[mcp.ReadResourceResponse], error) {
contents, err := fs.ReadFile(s.fs, strings.TrimPrefix(req.Params.URI, "file://"))
if err != nil {
return nil, err
}
return mcp.NewResponse(&mcp.ReadResourceResponse{
Contents: []mcp.ResourceContent{
{
URI: req.Params.URI,
MimeType: mime.TypeByExtension(filepath.Ext(req.Params.URI)),
Text: string(contents), // TODO: base64 encode
},
},
}), nil
}
func main() {
flag.Parse()
root := flag.Arg(0)
if root == "" {
root = "/"
}
server := mcp.NewStdioServer(&FSServer{
fs: os.DirFS(root),
})
if err := server.Listen(context.Background(), os.Stdin, os.Stdout); err != nil {
log.Fatal(err)
}
}
この例をコンパイルして、Claude Desktop(またはほかの MCP クライアント)に接続できます。
{
"mcpServers": {
"fs": {
"command": "/path/to/mcp-go-fs",
"args": [
"/path/to/root/directory"
]
}
}
}
ドキュメント
ロードマップ
基本プロトコルの大部分は実装済みです。以下の機能をロードマップに掲載しています。
- 通知
- サンプリング
- ルート
法的事項
MIT ライセンスのもとで提供されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。