4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwitchBotを操作するMCPサーバをGo(mcp-go)で作った話

Posted at

最近流行っている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するような単純なことだけでなく、下記のように複数のデバイスにまたがって操作を指示することができるようになります。

image.png

今回実装した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)
	}
}
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?