最近流行っているMCPサーバを理解するためにも、なにか作ってみたいなと思い手元にあったSwitchBotを操作するMCPサーバを作ってみました。
またGitHub公式のMCPサーバでも使われているmcp-goを使ってGo言語で作ってみたのでmcp-goの使い方も軽く紹介したいと思います。
SwitchBot MCPサーバ紹介
今回作成したSwitchBotのMCPサーバは下記のリポジトリで公開しています。
設定方法
MCPサーバの設定方法はGitHubのREADMEにも記載してあります📝
今回はSwitchBot APIを使用するためSwitchBotのアプリの「開発者向けオプション」からトークンとシークレットを準備する必要があります。
(初回はアプリバージョンを10回タップして「開発者向けオプション」を表示させる必要があります)
MCPサーバのバイナリはreleasesページで配布しているのでダウンロードしてください。
現状ローカルでMCPサーバを動かすことが多い中で、Go言語の複数プラットフォーム向けのバイナリを簡単に準備して配布できる点はGo言語でMCPサーバを作るメリットだなと思いました
Claude DesktopのMCPサーバの設定は下記のようにバイナリを指定して、トークンとシークレットをenv
に記載してください。
{
"mcpServers": {
"switchbot": {
"command": "~/Downloads/switch-bot-mcp-server",
"env": {
"SWITCH_BOT_TOKEN": "YOUR_SWITCH_BOT_TOKEN",
"SWITCH_BOT_SECRET": "YOUR_SWITCH_BOT_SECRET"
}
}
}
}
使い方
現在はデバイス一覧の取得と、各デバイスのステータス取得、デバイスのON/OFFのToolのみを実装しています。
上記のように単純なToolのみしか実装していないですが、LLMを介すことでデバイスをON/OFFするような単純なことだけでなく、下記のように複数のデバイスにまたがって操作を指示することができるようになります。
今回実装したToolやレスポンスについてLLM向けの説明を全然書いていないですが、SwitchBotが一般的に広まっていてLLMの事前学習データに含まれているため特に説明しないでも良い感じに動いているのかなと思いました
他にもこのMCPサーバを使用して便利な使い方など見つけましたらコメントでぜひ教えてください!
mcp-goの使い方
この記事時点ではmcp-goはv0.22.0
を使用しているので、実装方法が変わっている可能性などには注意してください。
MCPサーバ起動とToolの実装方法
簡単な紹介ですがToolの実装であれば下記の通りすぐに実装することができます!
その他の細かい使い方はmcp-goのexamplesなどが参考になると思います。
package main
import (
"context"
"fmt"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
// MCPサーバの定義
mcpServer := server.NewMCPServer(
"Tax MCP",
"0.1.0",
)
// Toolの追加
mcpServer.AddTool(
mcp.NewTool(
"calc_tax",
mcp.WithDescription("税抜き金額を受け取って税込金額を返す"),
mcp.WithNumber("price", mcp.Required(), mcp.Description("税抜き金額")),
),
func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
price := request.Params.Arguments["price"].(float64)
tax := 0.1
taxIncludedPrice := price * (1 + tax)
return mcp.NewToolResultText(fmt.Sprintf("%.2f", taxIncludedPrice)), nil
},
)
// stdioを介したMCPサーバを起動
if err := server.ServeStdio(mcpServer); err != nil {
fmt.Printf("Server error: %v\n", err)
}
}