14
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?

Model Context Protocol (MCP)の通信をBurp Suiteで取得する

Last updated at Posted at 2025-12-10

Model Context Protocol (MCP)サーバーとクライアント間の通信をBurp Suiteで取得する手順をまとめます。MCP Go SDKで簡単なMCPサーバーを作成し、MCP Inspectorをクライアントとして使用して、その通信をBurp Suiteで取得します。

検証環境

  • macOS
  • Go 1.25.5
  • Burp Suite Professional v2025.10.6
  • MCP Inspector 0.16.7

MCP Inspector 0.16.8からnode-fetchを利用しているため、undiciのEnvHttpProxyAgentでは通信が取れなくなっています。今回は通信の流れを確認したいため0.16.7を利用します。
また最新のバージョンはConnection TypeDirectにしたらMCPへの通信をブラウザから取得できます(追記)。

Model Context Protocol (MCP) とは

割愛します。詳細は公式ドキュメントを参照してください。

MCP Go SDKでMCPサーバーを作成

MCP Go SDKを使用してシンプルなMCPサーバーを作成します。名前を受け取り「Hello, [name]!」を返すだけのシンプルな機能を実装します。

main.go
func main() {
  // MCPサーバーの作成
  server := mcp.NewServer(&mcp.Implementation{
    Name:"demo",
    Version:"v0.0.1"
  }, nil)

  // ツールの登録
  mcp.AddTool(server, &mcp.Tool{
    Name:"say_hello",
    Description: "Say hello"
  }, helloHandler)

  //省略
}

// ハンドラー実装
func helloHandler(ctx context.Context, request *mcp.CallToolRequest, args HelloWorldArgs) (*mcp.CallToolResult, any, error) {
  return &mcp.CallToolResult{
    Content: []mcp.Content{
      &mcp.TextContent{Text: fmt.Sprintf("Hello, %s!", args.Name)},
    },
  }, nil, nil
}

サーバーは起動時に--sseまたは--httpフラグで通信方式を選択できます。またMCPサーバーは http://localhost:8000 で起動するとします。

zsh
$ go run main.go --sse   # SSE
$ go run main.go --http  # Streamable HTTP

MCP Inspectorのセットアップ

MCP Inspectorは、MCPサーバーの動作確認やデバッグに使用できる公式ツールです。

The MCP Inspector consists of two main components that work together:

  • MCP Inspector Client (MCPI): A React-based web UI that provides an interactive interface for testing and debugging MCP servers
  • MCP Proxy (MCPP): A Node.js server that acts as a protocol bridge, connecting the web UI to MCP servers via various transport methods (stdio, SSE, streamable-http)

引用: Architecture Overview - MCP Inspecor

このような構成になっているので、ブラウザからMCP Inspectorの通信を取ってもMCPIからMCPPへの通信になります。MCPサーバーとの実際の通信はMCPPが行うため、MCPPの通信を取得する必要があります。

[MCPI (:6274)] - Web UI
    ↓ HTTP
[MCPP (:6277)] - Proxy
    ↓ SSE/HTTP/stdio (ここをBurp Suiteで取得したい!!)
[MCPサーバー (:8000)]

インストールとビルド

今回はプロキシ設定を挟むため、ローカルにクローンして実行します。

zsh
$ git clone --branch 0.16.7 https://github.com/modelcontextprotocol/inspector.git
$ cd inspector
$ npm ci
$ npm run build

プロキシ設定

MCPIからMCPPへの通信をProxy経由にしたいので、undiciライブラリを使ってプロキシ設定を追加するモジュールを作成します。

proxy-preload.cjs
const { EnvHttpProxyAgent, setGlobalDispatcher } = require('undici');
setGlobalDispatcher(new EnvHttpProxyAgent());
console.log('Using proxy via', process.env.HTTP_PROXY, process.env.HTTPS_PROXY);

適宜undiciをインストールしてください。

zsh
$ npm i undici

次に起動用のスクリプトを作成します。

run.sh
#!/bin/zsh

export HOST=127.0.0.1
export ALLOWED_ORIGINS=http://127.0.0.1:6274

export NODE_USE_ENV_PROXY=1
export NODE_OPTIONS="--require $(pwd)/proxy-preload.cjs"
#export NODE_EXTRA_CA_CERTS="./burp-ca.pem"

export HTTP_PROXY="http://127.0.0.1:8089"
export HTTPS_PROXY="http://127.0.0.1:8089"

npm start

HTTPSのMCPサーバーへの通信を取得する場合は NODE_EXTRA_CA_CERTS でBurpの証明書を指定してください。ProxyのCA証明書エクスポートでDER形式で保存後、OpenSSLコマンドでPEM形式に変換が必要です。

zsh
$ openssl x509 -inform der -in cacert.der -out burp-ca.pem

構成例

.
├── inspector [一部抜粋]
│   ├── burp-ca.pem (任意)
│   ├── package-lock.json
│   ├── package.json
│   ├── proxy-preload.cjs
│   ├── run.sh
│   └── src
└── mcp
    ├── go.mod
    ├── go.sum
    └── main.go

MCP Inspectorの起動

zsh
$ ./run.sh

ブラウザが自動的に開きInspector UIが表示されます。

Burp Suiteの設定

細かい設定などは割愛します。

  1. Burp Suite を起動します
  2. Proxy > Proxy settings を開く
  3. Proxy Listeners で 127.0.0.1:8089 を設定
    • 環境に合わせて変更してください
  4. Intercept は OFF にしておく
  5. Streaming Responses を設定
    • 「Process streaming responses」をチェック

Burp Suiteで通信を確認

事前準備(共通)

  1. MCPサーバーを起動
    • SSEの場合: go run main.go --sse
    • Streamable HTTPの場合: go run main.go --http
  2. MCP InspectorをProxy設定した状態で起動
  3. Inspector UIでTransport Typeを選択し、URL「http://localhost:8000」を入力してConnectで接続

SSEの通信確認

初期接続

SSEで接続を確立し、MIME typeがSSEの通信として表示されます。

sse-burp1.png

tools/listの実行

Inspector UIでtools/listを実行すると、POSTリクエストとして送信されます。
sse-burp2.png

ツール一覧はSSEのイベントストリーム内で確認できます。
sse-burp3.png

tools/callの実行

ツールsay_helloの呼び出しも同様にPOSTリクエストとして送信されます。
sse-burp4.png

実行結果は一覧と同様にSSEストリームで返却されます。
sse-burp5.png

Repeaterでの再送

Burp SuiteのRepeaterでツールの呼び出しリクエストを送信できます。
sse-burp6.png

同じセッションを使うと既存のSSE接続を利用するので、Proxy historyのSSEイベントストリーム内で結果を確認できます。
sse-burp7.png

すべての流れをRepeaterで確認したい場合は SSE -> initialize -> tools/call の順で送信してください。

ブラウザからの通信

ブラウザからも同じリクエスト・レスポンスを確認できます。ただし、ブラウザの通信はMCPサーバー(:8000)ではなくMCPP(:6277)宛てになる点に注意してください。

sse-burp8.png

Streamable HTTPの通信確認

初期接続と通信方式

SSEと異なり、Streamable HTTPは各メッセージごとにPOSTリクエストの結果を確認できます。

http-burp1.png

tools/listの実行

Inspector UIでtools/listを実行するとPOSTリクエストが送信され、レスポンスボディで結果を確認できます。

http-burp2.png

tools/callの実行

ツールsay_helloの呼び出しも同様にPOSTリクエストが送信され、レスポンスボディで結果を確認できます。

http-burp3.png

Repeaterでの再送

Repeaterでの再送も可能です。SSEと異なりレスポンスに結果が入るので確認しやすいです。

http-burp4.png

まとめ

MCP Go SDKでMCPサーバーを作成し、MCP Inspectorをクライアントとして使用することで、MCPプロトコルの通信をBurp Suiteで取得できました。
MCP InspectorはMCPI + MCPP構成のため、MCPとの通信はMCPPの通信を取得する必要があります。

参考資料


追記

MCP Inspector 0.17.0 からConnection Typeを選択することが可能になり、MCPP経由しないで直接MCPサーバーに通信できるようになりました。
MCPサーバーのレスポンスで以下のようなレスポンスヘッダをつけることで問題なく通信を取得できることを確認しました。

  • プリフライトリクエストのレスポンスヘッダ
Access-Control-Allow-Origin: http://localhost:6274
Access-Control-Allow-Methods: POST, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version
  • その他リクエストのレスポンスヘッダ
Access-Control-Allow-Origin: http://localhost:6274
Access-Control-Expose-Headers: Mcp-Session-Id

Access-Control-Expose-Headersヘッダをつけないとnotifications/initializedのリクエストなどにMcp-Session-Idをリクエストヘッダにつけてくれなくなります。

参考情報: Streamable HTTP: header Mcp-Session-Id is not set for "notifications/initialized" request

14
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
14
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?