はじめに
会社で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は以下のような指摘と具体的な改善コードを自律的に提示してくれました。
改善提案として
スライスの事前割り当て:
- make([]int, 0, 1000000)で必要な容量を事前に確保
- 不要な再割り当てを防ぎ、メモリ使用を効率化
スライスの再利用:
- 毎回新しいスライスを作成する代わりに、既存のスライスをリセット(data = data[:0])
- GCの負荷を軽減
これらの変更により:
- メモリ割り当ての回数が大幅に減少
- GCの実行頻度が低下
- 全体的なパフォーマンスが向上
といった結果を自動で行ってくれます。
このように、開発者は「改善して」と指示するだけで、AIがMCPサーバーからデータを取得し、自律的に分析、具体的な改善コードまで提案してくれる流れが実現できます。
まとめ
「推測するな、計測せよ」という言葉があるように、効果的なパフォーマンス改善は、勘や経験だけに頼るのではなく、実際の動作データに基づいたアプローチが不可欠です。しかし、その「計測」自体が手間だったり、得られたデータの解釈が難しかったりすることもあります。
今回作成・検証した pprof-mcp-agent は、このプロセスにAIの自律性を取り込むことを可能にします。CursorのようなMCPクライアントと連携することで、
- 簡単な指示で pprof データをAIに取得させる。
- AIが自律的にデータを分析し、ボトルネックを特定、要約する。
- AIが具体的なコード改善案まで自律的に提案する。
- 改善前後の比較・評価もAIに依頼できる。
といった、データに基づきつつもAIの自律性を活用した、新しいパフォーマンスチューニングの形が実現できます。MCPサーバーを自作しAIと連携させることで、単なる情報取得を超えた、自律的な問題解決支援の可能性を実感できました。
開発中のGoアプリケーションに pprof-mcp-agent を組み込み、データドリブンなパフォーマンス改善を実践してみてはいかがでしょうか。