pprofの結果を出力するMCPサーバーを作って自律的にパフォーマンス改善を行う

2025-04-18

はじめに

会社でCursorを検証していて、カジュアルにMCPクライアントが使えるようになったので、かつ、実際にMCPサーバー作ってみないと何ができるか見えてこないので、試しにpprof-mcp-agentを作成し、MCPサーバーの構築とCursorの利用を検証しました。

この記事では、pprof-mcp-agentのセットアップ方法から、実際にAI(例:CursorのようなMCPクライアント)と連携してプロファイル情報を取得し、パフォーマンス改善の検証に役立てる流れを解説します。

pprofとは?

pprofは、Goのランタイムに組み込まれているプロファイリングツールです。CPU使用率、メモリ割り当て、goroutineの状態など、アプリケーションのパフォーマンスに関する詳細な情報を収集できます。通常は net/http/pprof パッケージを使ってHTTP経由でアクセスしたり、runtime/pprof パッケージでコードから直接プロファイルを取得したりします。

MCP (Model Context Protocol) とは?

MCPは、大規模言語モデル(LLM)のようなAIモデルが、外部のツールやサービスと安全かつ構造化された方法で対話するためのプロトコルです。AIはMCPを通じてツールに特定のタスク(例えば、特定のプロファイル情報の取得)をリクエストし、ツールはその結果をAIに返すことができます。これにより、AIは単なるテキスト生成だけでなく、能動的に情報を収集し、分析を実行できるようになります。

pprof-mcp-agent の紹介

pprof-mcp-agent は、pprofのプロファイリング機能をMCPサーバーとして公開するGoライブラリです。これにより、MCPに対応したAIが、実行中のGoアプリケーションに対してプロファイル取得のリクエストを送れるようになります。

例として

func heavyProcess() {
	for {
		var data []int
		for i := 0; i < 1000000; i++ {
			data = append(data, i)
		}
		_ = data
		time.Sleep(1 * time.Second)
	}
}

のようなプロセスを動かしておきます。

Goを動かしているプロセスの中でpprofmcpagentも起動します。

func main() {
	ctx := context.Background()

	go heavyProcess()

	err := pprofmcpagent.ServeSSE(ctx, ":1239")
	if err != nil {
		...
	}
}

MCPクライアントに

{
  "mcpServers": {
    "pprof": {
      "url": "http://localhost:1239/sse"
    }
  }
}

を登録します。

その後Chatで

pprofを利用してパフォーマンス改善して

と聞いてみます。

分析の結果、Cursorは以下のような指摘と具体的な改善コードを自律的に提示してくれました。

main go — pprof-mcp-agent

main go — pprof-mcp-agent

改善提案として

スライスの事前割り当て:

スライスの再利用:

これらの変更により:

といった結果を自動で行ってくれます。

このように、開発者は「改善して」と指示するだけで、AIがMCPサーバーからデータを取得し、自律的に分析、具体的な改善コードまで提案してくれる流れが実現できます。

まとめ

「推測するな、計測せよ」という言葉があるように、効果的なパフォーマンス改善は、勘や経験だけに頼るのではなく、実際の動作データに基づいたアプローチが不可欠です。しかし、その「計測」自体が手間だったり、得られたデータの解釈が難しかったりすることもあります。

今回作成・検証した pprof-mcp-agent は、このプロセスにAIの自律性を取り込むことを可能にします。CursorのようなMCPクライアントと連携することで、

といった、データに基づきつつもAIの自律性を活用した、新しいパフォーマンスチューニングの形が実現できます。MCPサーバーを自作しAIと連携させることで、単なる情報取得を超えた、自律的な問題解決支援の可能性を実感できました。

開発中のGoアプリケーションに pprof-mcp-agent を組み込み、データドリブンなパフォーマンス改善を実践してみてはいかがでしょうか。