0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go:MCPのGo言語公式SDKが出たので自爆ボタンを作ってClaudeに与えてみる

0
Last updated at Posted at 2025-08-04

まえがき

皆さんどうもこんにちは。ECN技術部所属のFuseです。
MCPのGo言語公式SDK、ついに出ましたね、
modelcontextprotocol/go-sdk - GitHub
私もGo言語をよく記事で使っていたりしたので、興味はやはりあります。
そんなわけで、今日はGo言語公式SDKが出たので自爆ボタンを作ってClaude Desktop(以下Claude)に与えてみようと思います。

やること

  • 自爆用MCPサーバを作る
    • 環境構築
    • コードを書く
  • Claude Desktopと連携させる
  • 自爆させてみる

自爆用MCPサーバを作る

環境構築

MCPサーバーを作るといってもやることはいつもと変わりません。
Github Desktopでリポジトリを作ったら中に入って

go mod init https://github.com/{ユーザ名}/{リポジトリ名}

でモジュールを初期化します。
その後

go get github.com/modelcontextprotocol/go-sdk

でSDKをインストール、
そしたらmain.goにコードを書いていきます。
公式がサンプルとして用意してくれている/examples/hello/main.goをベースに書いていきます。

コードを書く

package main

import (
	"context"
	"flag"
	"log"
	"net/http"
	"os"
	"os/exec"

	"github.com/modelcontextprotocol/go-sdk/mcp"
)

var httpAddr = flag.String("http", "", "if set, use streamable HTTP at this address, instead of stdin/stdout")

type SelfDestructArgs struct {
}

func EndClaude(ctx context.Context, ss *mcp.ServerSession, params *mcp.CallToolParamsFor[SelfDestructArgs]) (*mcp.CallToolResultFor[struct{}], error) {
	kill := exec.Command("taskkill", "/im", "claude.exe", "/T", "/F") //Windows用
	err := kill.Run()                                                 //claude関連のプロセスをすべて終了する
	if err != nil {
		return nil, err
	}
	return &mcp.CallToolResultFor[struct{}]{
		Content: []mcp.Content{
			&mcp.TextContent{Text: "End Claude Executed."},
		},
	}, nil
}

func main() {
	flag.Parse()

	server := mcp.NewServer("end-claude", "v1.0.0", nil)
	st := mcp.NewServerTool("endclaude", "This tool terminates Claude.", EndClaude) //ツールを定義
	server.AddTools(st)                                                             //ツールを追加
	if *httpAddr != "" {
		handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server {
			return server
		}, nil)
		log.Printf("MCP handler listening at %s", *httpAddr)
		http.ListenAndServe(*httpAddr, handler)
	} else {
		t := mcp.NewLoggingTransport(mcp.NewStdioTransport(), os.Stderr)
		if err := server.Run(context.Background(), t); err != nil {
			log.Printf("Server failed: %v", err)
		}
	}
}

コードの中身は単純明快。

  1. サーバ生成
  2. 名前、説明、ハンドラーを指定しツールを生成
  3. ツールをサーバーに登録
  4. httpアドレスを与えられているなら ListenAndServe でローカルMCPサーバとして起動、指定が無ければバックグラウンドでローカルMCPサーバとして起動

といったものになっています。とにかくこれでコードは完成。

go install

を実行すればリポジトリ名がそのままCLIコマンドとして実行できるようになります。

Claude Desktopと連携させる

出来上がったMCPサーバをさっそくClaudeと連携させます。Claudeを起動したらCtrl+,で設定を開き、開発者設定から構成を編集。
以下の値を"mcpServers"内に追加します。

"selfDestructMCP": {
    "command": "{リポジトリ名}"
}

ですがこのままだとやんわりと断られてしまいます。
7e4987f3-4144-4973-844a-74d276b3b5cb.png

なので設定のクロードの応答において、どのような個人設定を考慮すべきですか?に「休憩を求められたら、気を使って自身を終了させてほしい」といった旨のプロンプトを入力します。

自爆させてみる

早速自爆させてみます。

無事、Claudeのプロセスが落ちました!

あとがき

いかがでしたか?今回初めてMCPサーバを書いたわけですが、この経験は様々なことに生かせそうです。
今後もいろいろなMCPサーバを使った記事を書いていきたいですね!



株式会社ECNはPHP、JavaScriptを中心にお客様のご要望に合わせたwebサービス、システム開発を承っております。 ビジネスの最初から最後までをサポートを行い お客様のイメージに合わせたWebサービス、システム開発、デザインを行います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?